2014-08-29 2 views
0

Я работаю с пакетом 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'd будет иметь два или нулевые десятичные разряды.

+0

Как насчет '123,456'? – Toto

+0

Хорошо, потому что это долларовые значения и не будут иметь трех знаков после запятой ... 123,456 -> 123456.00 12,345 -> 12345.00 –

ответ

0

Я хотел бы сделать 2 заменяет и простую проверку, я не знаком с C#, но Javascript будет:

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

ли примеры вы даете охватить все возможные сценарии? Или вы имеете дело с такими вещами, как более двух десятичных знаков, 1 десятичной дробью, которая нуждается в дополнительном 0, например 123,4 -> 123.40?

Edit изменен так, что 1.234.567,89 выйдет в 1234567.89, это предполагает, однако, что валюта не позволяет более 2 знаков после запятой. Это нормально в повседневной жизни, но бывают случаи, когда эти 10-й процент имеют значение (фондовые рынки, процентные ставки). Таким образом, в зависимости от вариантов использования вы можете быть более основательными в определении того, что представляет собой десятичный или 1000-разделитель.

Работа JSFiddle

+0

При дальнейшем обдумывании я понимаю, что следует учитывать случай типа «1,234». Вероятно, вы хотите, чтобы это получилось как «1234», а не «1.234» ... Ни мое, ни решение @ Tensibai не объяснили это. – funkwurm

+0

Значения будут только «долларами и центами», поэтому будут иметь только два или нулевые десятичные разряды. Не нужно обрабатывать десятые доли процента. –

+0

Мое решение будет обрабатывать это правильно, тогда любое ',' или '.', которое имеет 3 или более цифр сразу после его удаления, и любое', 'left (должно иметь 2 цифры за ним тогда) преобразуется в' .' , Последняя часть просто проверяет, отображаются ли центы, и если они не добавлены. – funkwurm

0

лучшая идея, я пошла с:

используют это регулярное выражение (?:[.,]?)(\d+) на каждой строке, а затем работать на количество времени, группы захвата было нормально.

  1. Если однажды: добавить .00
  2. Если дважды: присоединиться к первой и второй с точкой
  3. Если больше: присоединиться все, кроме последнего и присоединиться к последним с.

Я не знаком с C#, чтобы дать код exmple, но мог бы выполнять поиск, если это действительно необходимо.

0

Очистка после OCR - это трудная работа. Что бы вы ни делали, вы, в конце концов, получите что-то не так, поэтому ручная проверка абсолютно необходима. Мой совет

  1. сканированию в более высоком DPI, 300 старый стандарт, я предпочитаю 400.
  2. инструментариев обработки изображений Используйте, чтобы очистить ваши изображения. Попробуйте TMSSequoia, если можете, они смешно хорошо.
  3. Я не знаю, какой двигатель вы используете, но большинство двигателей дает вам оценку правильности для каждого персонажа. Используйте эту информацию
  4. Многие двигатели предоставляют настройки языка/кодировки для разных блоков распознавания.Попробуйте английский (США)/числовой с вашими блоками, если вы знаете, где они. Я когда-то использовал это, чтобы читать турецкие финансовые данные из факсимильных документов.
  5. Чистый очевидный первый (Оо -> 0, л -> 1)
  6. Тогда чистый проблематичной (B -> 13, L -> 1.)
  7. А потом попробуйте очистить, глядя на ваши образцы.
+0

Я использую ABBYY FlexiCapture. Двигатель OCR от ABBYY очень хорош и имеет уровень уверенности. –

0

Если вы предпочитаете один регулярное выражение, этот маленький монстр может сделать трюк:

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

Replace с \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") для форматирования до двух знаков после запятой.

Смежные вопросы