2014-08-29 69 views
0

我正在使用OCR包从文档中提取货币金额值。偶尔小数点会被错误地作为逗号进行OCR。该软件可以进行字符替换,即开即用,但我不能用''替换所有','。因为“数千个逗号”。该软件允许编写客户脚本以验证和纠正各种语言的值。我正在使用C#。我已经尝试过多种方式来做到这一点,从子字符串替换到正则表达式替换,再到全球化和数字样式的Double.Parse等。您会推荐什么来实现所有以下转换?OCR号码格式校正和转换

12.345,67 -> 12345.67 
12345.67 -> 12345.67 (no change) 
12,345.67 -> 12345.67 
1,234.56 -> 1234.56 
1.234.56 -> 1234.56 
1.234,56 -> 1234.56 
123,45 -> 123.45 
123.45 -> 123.45 (no change) 
1234  -> 1234.00 
1,234  -> 1234.00 
123  -> 123.00 

编辑。根据提出的问题添加更多示例。 注意:价值将以美元和美分。无需处理“十分之一美分”。 OCR的值将有两个或零小数位。

+0

'123,456'呢? – Toto 2014-08-29 11:17:00

+0

那么,因为这些都是美元的价值,并且不会有三位小数... 123,456 - > 123456.00 12,345 - > 12345.00 – 2014-08-29 22:36:23

回答

0

我会做2所取代并进行简单的检查,我不熟悉C#,但使用Javascript将是:

var newVal = value.replace(/[,.](?=\d{3,})/g, '').replace(',', '.'); 
if (newVal.indexOf('.')==-1) 
    newVal = newVal + '.00'; 

你给包括每一个可能的场景的例子吗?或者你处理的东西像2个以上的小数,1个小数,需要额外的0,如123,4 -> 123.40

编辑改变,因此1.234.567,89会出来为1234567.89,这个假设虽然,货币不允许超过2位小数。这在日常生活中是正常的,但有些情况下,10美分的十分重要(股票市场,利率)。因此,根据使用情况,您可能想要更全面地确定哪个是小数点或1000个分隔符。

工作JSFiddle

+0

经过进一步的思考,我意识到应该考虑像'1,234'这样的情况。你可能想让它像'1234'而不是'1.234'出来......我的和Tensibai的解决方案都不能解释它。 – funkwurm 2014-08-29 10:38:33

+0

值只会是“美元和美分”,所以只会有两个或零个小数位。无需处理十分之一分。 – 2014-08-29 22:39:23

+0

我的解决方案可以正确处理,那么任何','或'.'在被删除后立即有3个或更多的数字,任何','离开(必须有2个数字后)将被转换为'.' 。最后一部分只是检查是否显示美分,如果没有添加。 – funkwurm 2014-09-01 06:16:29

0

我去了最好的办法:每行

使用这个表达式(?:[.,]?)(\d+),然后在时间的捕捉组是确定的数字工作。

  1. 如果一次:添加.00
  2. 如果两次:加入第一和第二位点
  3. 如果更多:加入所有,但最后并加入最后用。

我对C#不够熟悉,给出了一个代码实例,但可以在真正需要时进行搜索。

0

OCR清理后是一项艰巨的工作。无论你做什么,你最终都会出错,所以手动检查是绝对必要的。我的建议

更高的DPI
  1. 尝试扫描,300是旧标准,我更喜欢400
  2. 使用图像处理工具包来清除图像。尝试TMSSequoia,如果可以的话,他们是可笑的 好。
  3. 我不知道你使用了哪个引擎,但大多数引擎会为你提供每个角色正确性的评估。使用此信息
  4. 许多引擎为不同识别块提供语言/字符集设置。如果您知道自己在哪里,请尝试使用英文(美国)/ Numeric。我曾经用它从传真文件中读取土耳其财务数据。
  5. 清洁明显的第一(OO - > 0,1 - > 1)
  6. 然后清理有问题的(B - > 13,L - > 1)
  7. 然后尝试看你的样品进行清洗。
+0

我正在使用ABBYY FlexiCapture。 ABBYY的OCR引擎非常好,确实有信心。 – 2014-09-02 03:06:49

0

如果你喜欢一个单一的正则表达式,这个小怪物可能做的伎俩:

^ 
    (?: 
     (?: 
     (\d{1,3}) 
     (?: [.,] (\d{3}))? 
     (?: [.,] (\d{3}))? 
     (?: [.,] (\d{3}))? 
    ) 
     | 
     (\d+) 
    ) 
    (?: 
     [.,] (\d\d) 
    )? 
$ 

替换\1\2\3\4\5.\6

Demo

注意,它只能处理量可高达$999.999.999.999,99,如果你为政府工作,随意添加更多[.,]组))。

0

我结束了很长的一段路。我不会称它为不雅,但它比我想要的要长。

StringBuilder sb = new StringBuilder(strTotalIncGST); 
if (strTotalIncGST.Length > 3) 
{ 
    int decPos = strTotalIncGST.Length - 3; 
    if (sb[decPos] == ',') 
    { 
     sb.Remove(decPos, 1); 
     sb.Insert(decPos, "."); 
    } 
} 
if (strTotalIncGST.Length > 7) 
{ 
    int thouPos = strTotalIncGST.Length - 7; 
    if (sb[thouPos] == '.' || sb[thouPos] == ',') 
    { 
     sb.Remove(thouPos, 1); 
    } 
} 

,然后用double.TryParse()转换为与.ToString("F2")翻一番,然后再返回到字符串格式化到小数点后两位。