使用toFixed生成CSV时因€符号引发数值显示异常问题
问题:CSV导出时数值格式异常,带€符号时11.00变成1.100
以下是示例代码:
function download() { const num = (11).toFixed(2); const content = [['Number'],[num + ' €']]; const universalBOM = '\uFEFF'; const csvContent = content.map((row) => row.join(',')).join('\r\n'); const blob = new Blob([`${universalBOM}${csvContent}`], { type: 'text/csv' }); const link = document.createElement('a'); link.setAttribute('href', URL.createObjectURL(blob)); link.setAttribute('download', `download.csv`); document.body.appendChild(link); link.click(); document.body.removeChild(link); } download();
预期下载的CSV文件内容应为11.00 €,但实际打开后显示的却是1.100 €。如果把€替换成其他字符(比如$),数值就能正常显示为11.00 $。
原因分析
这是CSV文件被表格软件(如Excel)解析时的区域设置差异导致的:
- 当内容包含欧元符号
€时,软件会自动切换到欧洲部分国家的区域解析规则——这类规则里,逗号是千位分隔符,点是小数分隔符。 - 原本的
11.00 €会被误解析:把数值里的.识别为千位分隔符,11.00就变成了1,100(显示为1.100,这里的点是该区域的小数分隔符)。 - 换成
$符号时,软件会按英文区域规则解析,.作为小数分隔符,所以11.00 $能正常显示。
简单来说,欧元符号触发了软件的欧洲区域解析逻辑,把数值的小数点当成了千位分隔符,最终导致数值格式错误。
内容的提问来源于stack exchange,提问作者paulalexandru
相关产品推荐
相关产品推荐

