跳至內容
Astera Technology

數量 1.234,5 為何匯入成 1.234?

按明訂小數逗號格式解析,不用只吃到開頭的數字程序。

下載完整個案資料及參考答案 ↓

先核來源與已訂規則

本例數量用逗號作小數點,點號分組時每組三位;不可有正負號、空格,整數部分除了零本身也不可零起頭。只容非負、有限且不超過 1,000,000,原文另留。parseFloat 到逗號便停;更正核整段後才轉 JavaScript Number。

已填假設輸入
紀錄輸入 JSON
原例輸入{"raw":"1.234,5"}
下載可編輯 CSV ↓

比較兩條實際路徑

依已訂分組去點號,再換小數逗號,才得 1234.5;不是估未知地區格式或換貨幣。

錯誤與更正路徑的輸出
路徑輸出 JSON
錯誤路徑{"accepted":true,"value":1.234,"source":"1.234,5"}
更正路徑{"accepted":true,"value":1234.5,"source":"1.234,5"}
下載可編輯 CSV ↓
本地 Node.js 程序:22.23.3 或 24.14.1
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"}
下載可編輯 CSV ↓

按此已訂格式,1.234,5 是哪個值?

查看參考答案

1234.5,錯 1.234 只讀了前段;混合分隔寫法不能靠猜。

相關資源