我正在开发一个使用 OCR 引擎识别纸质文档的系统。这些文件是包含总额、增值税和 Netty 等金额的发票。我需要将这些金额字符串解析为数字,但它们有多种格式和风格,在每张发票的数字中使用不同的小数符号和千位分隔符。如果我尝试在 .NET 中使用普通的 double.tryparse 和 double.parse 方法,那么它们通常会因某些数量而失败
这些是我收到的一些例子
"3.533,65" => 3533.65
"-133.696" => -133696
"-33.017" => -33017
"-166.713" => -166713
"-5088,8" => -5088.8
"0.423" => 0.423
"9,215,200" => 9215200
"1,443,840.00" => 1443840
我需要一些方法来猜测数字中的小数分隔符和千位分隔符,然后将值呈现给用户以确定这是否正确。
我想知道如何以优雅的方式解决这个问题。
最佳答案
我不确定您是否能够找到一种优雅的方式来解决这个问题,因为如果您不能告诉它数据来自何处,它总是会变得模棱两可。
例如,数字 1.234 和 1,234 都是有效数字,但如果不确定符号的含义,您将无法分辨哪个是哪个。
就我个人而言,我会编写一个函数,尝试根据某些规则进行“最佳猜测”...
- 如果数字在
.
之前包含,
,则,
必须为千位,而.
必须为小数 - 如果数字在
,
之前包含.
,则.
必须是千位,,
必须是小数 - 如果有>1个
,
符号,千位分隔符必须是,
- 如果有>1个
.
符号,千位分隔符必须是.
- 如果只有 1 个
,
后面有多少个数字?如果它不是 3,那么它必须是 小数点分隔符(.
的规则相同) - 如果有 3 个数字分隔它(例如 1,234 和 1.234),也许您可以将这个数字放在一边并解析同一页面上的其他数字以尝试找出它们是否使用不同的分隔符,然后再回来查看它?
一旦您计算出小数点分隔符,删除任何千位分隔符(解析数字不需要)并确保小数点分隔符是 .在您正在解析的字符串中。然后你可以将它传递给 Double.TryParse
关于c# - 将金额字符串解析为数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1867217/