先核來源與已訂規則
本例數量用逗號作小數點,點號分組時每組三位;不可有正負號、空格,整數部分除了零本身也不可零起頭。只容非負、有限且不超過 1,000,000,原文另留。parseFloat 到逗號便停;更正核整段後才轉 JavaScript Number。
| 紀錄 | 輸入 JSON |
|---|---|
| 原例輸入 | {"raw":"1.234,5"} |
比較兩條實際路徑
依已訂分組去點號,再換小數逗號,才得 1234.5;不是估未知地區格式或換貨幣。
| 路徑 | 輸出 JSON |
|---|---|
| 錯誤路徑 | {"accepted":true,"value":1.234,"source":"1.234,5"} |
| 更正路徑 | {"accepted":true,"value":1234.5,"source":"1.234,5"} |
import {DatabaseSync} from 'node:sqlite';
import {TextDecoder} from 'node:util';
import {inflateSync} from 'node:zlib';
import {posix} from 'node:path';
import {createHash} from 'node:crypto';
const rows=(db,sql)=>db.prepare(sql).all().map(r=>({...r}));
const failed=(action)=>{try{action();return null;}catch(e){return {code:e.errcode??e.code??e.name};}};
import assert from 'node:assert/strict';
const run=function run(i,corrected=true){
if(!corrected)return {accepted:true,value:parseFloat(i.raw),source:i.raw};
if(!/^(?:0|[1-9]\d*|[1-9]\d{0,2}(?:\.\d{3})+)(?:,\d+)?$/.test(i.raw))return {accepted:false,error:'decimal-comma-grammar',source:i.raw};
const value=Number(i.raw.replace(/\./g,'').replace(',','.'));
if(!Number.isFinite(value)||value>1000000)return {accepted:false,error:'outside-supplied-range',source:i.raw};
return {accepted:true,value,source:i.raw};
};
const cases=[{"label":"misleading base","input":{"raw":"1.234,5"},"expected":{"accepted":true,"value":1.234,"source":"1.234,5"},"corrected":false},{"label":"corrected base","input":{"raw":"1.234,5"},"expected":{"accepted":true,"value":1234.5,"source":"1.234,5"},"corrected":true},{"label":"mixed separator conventions","input":{"raw":"1,234.5"},"expected":{"accepted":false,"error":"decimal-comma-grammar","source":"1,234.5"},"corrected":true},{"label":"canonical zero","input":{"raw":"0"},"expected":{"accepted":true,"value":0,"source":"0"},"corrected":true}];
for(const test of cases){
const actual=run(test.input,test.corrected);
assert.deepEqual(actual,test.expected,test.label);
console.log(test.label,actual);
}
下次載入前核邊界
混合寫法 1,234.5 拒收;標準 0 保作真正零數量。
| 情況 | 輸入 JSON | 預期輸出 JSON |
|---|---|---|
| 分隔符約定混用 | {"raw":"1,234.5"} | {"accepted":false,"error":"decimal-comma-grammar","source":"1,234.5"} |
| 標準零數量 | {"raw":"0"} | {"accepted":true,"value":0,"source":"0"} |
按此已訂格式,1.234,5 是哪個值?
查看參考答案
1234.5,錯 1.234 只讀了前段;混合分隔寫法不能靠猜。