使用NPOI生成Excel时价格字段格式化异常问题咨询
问题根因
该问题是价格字符串转数值时的解析规则不匹配导致的:你传入的价格字符串使用逗号作为小数分隔符(如422,26),但double.Parse()默认使用当前系统线程的区域设置解析。如果当前运行环境的区域配置中,逗号是千分位分隔符、小数点用点表示,解析时就会把422,26中的逗号识别为千分位分隔符直接忽略,最终解析出数值42226,格式化后就显示为42226,00。
而380,00、4730,00看起来运行正常属于巧合,本质上也存在解析规则不匹配的隐患,只要运行环境的区域设置变化就会出问题。
修复方案
步骤1:显式定义价格解析的格式规则
在处理价格的代码前,先定义适配你价格格式的数字解析规则,避免受系统区域设置影响:
using System.Globalization; // 配置规则:逗号为小数分隔符,点为千分位分隔符,适配你传入的价格字符串格式 var priceParseFormat = new NumberFormatInfo { NumberDecimalSeparator = ",", NumberGroupSeparator = "." };
步骤2:修改价格解析逻辑
把所有double.Parse(item.Price)的调用,都加上上面定义的格式提供者,同时可以优化冗余代码:
else { ICell priceCell = row.CreateCell(1); // 不需要手动设置CellType,传入double类型值NPOI会自动设置为Numeric类型 priceCell.CellStyle = priceCellStyle; // 用自定义规则解析价格字符串 double originalPrice = double.Parse(item.Price, priceParseFormat); if (percentage != 0) { priceCell.SetCellValue(originalPrice * (1 + (double)percentage / 100)); } else { priceCell.SetCellValue(originalPrice); } }
可选:强制Excel固定显示逗号为小数分隔符
如果你需要不管用户打开Excel的区域设置是什么,价格都固定用逗号作为小数分隔符,可以把价格样式的格式串修改为指定区域的格式:
// 固定使用德语区域格式,永远显示逗号为小数分隔符 priceCellStyle.DataFormat = workbook.CreateDataFormat().GetFormat("[$-de-DE]#,##0.00");
内容的提问来源于stack exchange,提问作者Xyloto
相关产品推荐
相关产品推荐

