2013-07-16 2 views
1

У меня есть приложение для Android, и сегодня я получил отчет об ошибке, который содержит это: NumberFormatExceptionNumberFormatException при разборе хинди номера

Этот триггер исключение, когда приложение пытается разобрать номер строки, который предоставляется пользователю.

Очевидно, что проблема заключается в том, что приложение не может анализировать номера хинди! Итак, как я могу это решить?

+0

Просьба ** не отправлять изображения об ошибках, копировать и вставлять их в виде обычного текста. –

+0

Это приложение, которое вы пишете? На данный момент я не могу быть уверен, – hexafraction

+1

@LuiggiMendoza. Шрифт и локализация SO могут не поддерживать вставку соответствующих символов. – hexafraction

ответ

0

Попробуйте это. Это приведет к удалению не числовых символов.

Pattern p = Pattern.compile("(\\d+)"); 
    Matcher m = p.matcher(str); // str is input String 
    while(m.find()) { 
    System.out.println(m.group(1)); 
    } 

Если вы имеете дело с double (с знаков после запятой). Вы можете попробовать это

String text = "123.0114cc"; 
    String numOnly = text.replaceAll("\\p{Alpha}",""); 
    double numVal = Double.valueOf(numOnly); 
    System.out.println(numVal); 
+0

Спасибо, но это не решит проблему (я думаю). Потому что символы выше числа, но в формате хинди. Поэтому, если я попробую ваше решение, результат будет равен нулю все время, когда пользователь попытается ввести число. –

+0

ohh, тогда вы должны знать номер ведьмы, назначенный символу хинди ведьмы, и сделать карту

3

Regex

Использование регулярных выражений было бы лучше, если вы хотите, чтобы соответствовать любой Юникода digits.The регулярное выражение будет \\p{N}+ и вот как его использовать:

Matcher m=Pattern.compile("\\p{N}+").matcher(input); 
if(m.find()) 
{ 
    System.out.println(m.group()); 
} 

Locale

Чтобы ответить на ваш вопрос, вы должны использовать NumberFormat, как указано в docs. Укажите Locale для NumberFormat.

NumberFormat nf = NumberFormat.getInstance(new Locale("hi", "IN")); 
nf.parse(input); 
+0

Что вы имели в виду под регулярным выражением? Похоже, что NumberFormat с Locale является полным решением. –

+0

@BasilBourque вы можете сопоставить любые цифры в Юникоде с помощью регулярных выражений '\\ p {N} +' .. Я отредактирую ans – Anirudha

2

Вы можете использовать Character.getNumericValue(char).

Хорошая вещь об этом методе заключается в том, что он может делать то, что вам нужно.

Но для работы в действии вы должны реализовать в своей поддержке приложения для локального.

NumberFormat format = NumberFormat.getInstance(new Locale("hin","IND")); 

Number parse = format.parse("१"); 

System.out.println(parse); 

Отпечатки 1.

0

Применение

BigDecimal bigDecimal = new BigDecimal(YOUR_VALUE); 

перед применением регулярных выражений, как BigDecimal поддерживает 12 целые числа, 12,35 десятичных и 12 $ валюты, 12% процент и его локализованное значение.

0

Вы можете использовать следующий метод, который получает строку и преобразует каждую индийскую цифру внутри нее на арабский.

public static String convertAllIndianToArabic(String str) 
{ 
    for(int i=0; i<str.length(); i++) 
    { 
     if(str.charAt(i)=='٠') 
      str = str.substring(0, i)+"0"+str.substring(i+1); 
     else if(str.charAt(i)=='١') 
      str = str.substring(0, i)+"1"+str.substring(i+1); 
     else if(str.charAt(i)=='٢') 
      str = str.substring(0, i)+"2"+str.substring(i+1); 
     else if(str.charAt(i)=='٣') 
      str = str.substring(0, i)+"3"+str.substring(i+1); 
     else if(str.charAt(i)=='٤') 
      str = str.substring(0, i)+"4"+str.substring(i+1); 
     else if(str.charAt(i)=='٥') 
      str = str.substring(0, i)+"5"+str.substring(i+1); 
     else if(str.charAt(i)=='٦') 
      str = str.substring(0, i)+"6"+str.substring(i+1); 
     else if(str.charAt(i)=='٧') 
      str = str.substring(0, i)+"7"+str.substring(i+1); 
     else if(str.charAt(i)=='٨') 
      str = str.substring(0, i)+"8"+str.substring(i+1); 
     else if(str.charAt(i)=='٩') 
      str = str.substring(0, i)+"9"+str.substring(i+1); 

    } 

    return str; 
}