Подтвердить что ты не робот

Преобразование String в другую локаль в java

Привет
Мне нужно преобразовать арабские/персидские цифры к нему на английском языке (например, конвертировать "2" в "2" )
Как я могу это сделать?

Спасибо

4b9b3361

Ответ 1

Я предлагаю вам иметь десятизначную строку поиска и заменять все цифры по одному.

public static void main(String... args) {
    System.out.println(arabicToDecimal("۴۲"));
}

private static final String arabic = "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9";
private static String arabicToDecimal(String number) {
    char[] chars = new char[number.length()];
    for(int i=0;i<number.length();i++) {
        char ch = number.charAt(i);
        if (ch >= 0x0660 && ch <= 0x0669)
           ch -= 0x0660 - '0';
        else if (ch >= 0x06f0 && ch <= 0x06F9)
           ch -= 0x06f0 - '0';
        chars[i] = ch;
    }
    return new String(chars);
}

печатает

42

Причиной использования строк в качестве поиска является то, что другие символы, такие как . - ,, будут оставлены как есть. Фактически десятичное число не изменится.

Ответ 2

Я достиг этого класса java.math.BigDecimal, Ниже приведен фрагмент кода

String arabicNumerals = "۴۲۴۲.۴۲";
String englishNumerals = new BigDecimal(arabic).toString();
System.out.println("Number In Arabic : "+arabicNumerals);
System.out.println("Number In English : "+englishNumerals);

Результат

Number In Arabic : ۴۲۴۲.۴۲
Number In English : 4242.42

NB: Выше код не будет работать, если в арабском списке есть какие-либо символы, кроме числовых цифр, например: 4,242.42 приведет к java.lang.NumberFormatException, поэтому вы можете удалить другие, используя Character.isDigit(char ch) в другой логике и используя приведенный выше код. Все нормальные случаи работают превосходно!

Добрый день

Ответ 3

Я нашел более простой и быстрый способ, который включает в себя и две страницы арабского кода.

public static String convertToEnglishDigits(String value)
{
     String newValue = value.replace("١", "1").replace("٢", "2").replace("٣", "3").replace("٤", "4").replace("٥", "5")
             .replace("٦", "6").replace("7", "٧").replace("٨", "8").replace("٩", "9").replace("٠", "0")
             .replace("۱", "1").replace("۲", "2").replace("۳", "3").replace("۴", "4").replace("۵", "5")
             .replace("۶", "6").replace("۷", "7").replace("۸", "8").replace("۹", "9").replace("۰", "0");

     return newValue;
}

Он вернет номера в английском формате или наоборот, если вы измените замену. ( "0", "0" ) до ( "0", "0" )

Ответ 4

Попробуйте этих парней:

/**
 * Utility class to detect arabic languages and convert numbers into arabic digits.
 *
 * @author Ahmed Shakil
 * @date 09-24-2012
 */
public final class ArabicUtil {

private static final char[] DIGITS = {'\u0660','\u0661','\u0662','\u0663','\u0664','\u0665','\u0666','\u0667','\u0668','\u0669'};

/**
 * Returns <code>true</code> if the provided language code uses arabic characters; othersise <code>false</code>.
 * @param lang ISO language code.
 * @return <code>true</code> if the provided language code uses arabic characters; othersise <code>false</code>
 */
public static boolean isArabic (String lang) {
    return "ar".equals(lang) || "fa".equals(lang) || "ur".equals(lang);
}

/**
 * Convert digits in the specified string to arabic digits.
 */
public static String convertDigits (String str) {
    if (str == null || str.length() == 0) return str;

    char[] s = new char[str.length()];
    for(int i =0;i<s.length;i++)
        s[i] = toDigit( str.charAt( i ) );

    return new String(s);
}

/**
 * Convert single digit in the specified string to arabic digit.
 */
public static char toDigit (char ch) {
    int n = Character.getNumericValue( (int)ch );
    return n >=0 && n < 10 ? ARABIC[n] : ch;
}

/**
 * Convert an int into arabic string.
 */
public static String toString (int num) {
    return convertDigits( Integer.toString( num ) );
}
}

Кстати, есть разница между арабскими цифрами и урду/фарси: Арабский:

private static final char[] ARABIC     = {'\u0660', '\u0661', '\u0662', '\u0663', '\u0664', '\u0665', '\u0666', '\u0667', '\u0668', '\u0669'};

Урду или фарси:

private static final char[] URDU_FARSI = {'\u06f0', '\u06f1', '\u06f2', '\u06f3', '\u06f4', '\u06f5', '\u06f6', '\u06f7', '\u06f8', '\u06f9'};

Ответ 5

Сначала сделайте так, чтобы он выглядел хорошо, -)

public static char persianDigitToEnglish(char persianDigit) {
    return (char) (((int)persianDigit) - ((int)'۲' - (int)'2'));
}

Работает для 2, к сожалению, я не знаю других персидских цифр, не могли бы вы попробовать?

assertThat(persianDigitToEnglish('۲')).isEqualTo('2');

EDIT: (на основе версии Peter Lawrey String, но использует StringBuilder)

public static String persianDigitToEnglish(String persianNumber) {
    StringBuilder chars = new StringBuilder(persianNumber.length());
    for (int i = 0; i < persianNumber.length(); i++)
        chars.append(persianDigitToEnglish(persianNumber.charAt(i)));
    return chars.toString();
}

private static char persianDigitToEnglish(char persianDigit) {
    return (char) (((int)persianDigit) - ((int)'۲' - (int)'2'));
}

Ответ 6

так тривиальный ответ:

public static String convertNumbersToPersian(String str)
{
    String answer = str;
    answer = answer.replace("1","١");
    answer = answer.replace("2","٢");
    answer = answer.replace("3","٣");
    answer = answer.replace("4","٤");
    answer = answer.replace("5","٥");
    answer = answer.replace("6","٦");
    answer = answer.replace("7","٧");
    answer = answer.replace("8","٨");
    answer = answer.replace("9","٩");
    answer = answer.replace("0","٠");
    return answer;
}

и

public static String convertNumbersToEnglish(String str) {
    String answer = str;
    answer = answer.replace("١", "1");
    answer = answer.replace("٢", "2");
    answer = answer.replace("٣", "3");
    answer = answer.replace("٤", "4");
    answer = answer.replace("٥", "5");
    answer = answer.replace("٦", "6");
    answer = answer.replace("٧", "7");
    answer = answer.replace("٨", "8");
    answer = answer.replace("٩", "9");
    answer = answer.replace("٠", "0");
    return answer;
}

Ответ 7

он будет работать и с десятичной точкой.

public class mainsupport {
public static void main(String args[]){
//  String Numtoconvert="15.3201" ;
//  String Numtoconvert="458" ;
    String Numtoconvert="٨٧٫٥٩٨" ; // integer value 87.598

      System.out.println(getUSNumber(Numtoconvert));
}
private static String getUSNumber(String Numtoconvert){

    NumberFormat formatter = NumberFormat.getInstance(Locale.US);
      try {
          if(Numtoconvert.contains("٫"))      
          Numtoconvert=formatter.parse(Numtoconvert.split("٫")[0].trim())+"."+formatter.parse(Numtoconvert.split("٫")[1].trim());
          else
              Numtoconvert=formatter.parse(Numtoconvert).toString();
      } catch (ParseException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
      }
      return Numtoconvert;
}

отпечатки 87.598

Ответ 8

Я думаю, что лучший способ - изменить Locale на то, что вы хотите, например,
для двойного номера:

NumberFormat fmt = NumberFormat.getNumberInstance(Locale.US);
d = Double.parseDouble(s);

для строки:

NumberFormat.getNumberInstance(Locale.US).format(s);

или DecimalFormat:

double num;
DecimalFormat df = new DecimalFormat("###.###");
df.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.US));
String s = df.format(num);

Ответ 9

Используйте класс Locale для преобразования чисел.

 Locale locale = new Locale("ar");
 String formattedArabic = format(locale, "%d", value));

Ответ 10

Character.getNumericValue(ch) спас мне жизнь, универсальное решение для любой локали.

static String replaceNonstandardDigits(String input) {
    if (input == null || input.isEmpty()) {
        return input;
    }

    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < input.length(); i++) {
        char ch = input.charAt(i);
        if (Character.isDigit(ch) && !(ch >= '0' && ch <= '9')) {
            int numericValue = Character.getNumericValue(ch);
            if (numericValue >= 0) {
                builder.append(numericValue);
            }
        } else {
            builder.append(ch);
        }
    }
    return builder.toString();
}

Ответ 11

Пока я искал наиболее эффективное решение, я смешал ответы на Kishath и Sileria и получил чистый и быстрый результат:

public class StringLocalizer {
    private static final char[] ENGLISH_NUMBERS = {'\u0030', '\u0031', '\u0032', '\u0033', '\u0034', '\u0035', '\u0036', '\u0037', '\u0038', '\u0039'};
    private static final char[] PERSIAN_NUMBERS = {'\u06f0', '\u06f1', '\u06f2', '\u06f3', '\u06f4', '\u06f5', '\u06f6', '\u06f7', '\u06f8', '\u06f9'};
    private static final char[] ARABIC_NUMBERS = {'\u0660', '\u0661', '\u0662', '\u0663', '\u0664', '\u0665', '\u0666', '\u0667', '\u0668', '\u0669'};

    public static String on(String input) {
        String lang = Locale.getDefault().getLanguage();
        boolean isPersian = "fa".equals(lang) || "ur".equals(lang);
        boolean isArabic = "ar".equals(lang);
        if (isPersian) return input
                .replace(ENGLISH_NUMBERS[0], PERSIAN_NUMBERS[0])
                .replace(ENGLISH_NUMBERS[1], PERSIAN_NUMBERS[1])
                .replace(ENGLISH_NUMBERS[2], PERSIAN_NUMBERS[2])
                .replace(ENGLISH_NUMBERS[3], PERSIAN_NUMBERS[3])
                .replace(ENGLISH_NUMBERS[4], PERSIAN_NUMBERS[4])
                .replace(ENGLISH_NUMBERS[5], PERSIAN_NUMBERS[5])
                .replace(ENGLISH_NUMBERS[6], PERSIAN_NUMBERS[6])
                .replace(ENGLISH_NUMBERS[7], PERSIAN_NUMBERS[7])
                .replace(ENGLISH_NUMBERS[8], PERSIAN_NUMBERS[8])
                .replace(ENGLISH_NUMBERS[9], PERSIAN_NUMBERS[9]);
        else if (isArabic) return input
                .replace(ENGLISH_NUMBERS[0], ARABIC_NUMBERS[0])
                .replace(ENGLISH_NUMBERS[1], ARABIC_NUMBERS[1])
                .replace(ENGLISH_NUMBERS[2], ARABIC_NUMBERS[2])
                .replace(ENGLISH_NUMBERS[3], ARABIC_NUMBERS[3])
                .replace(ENGLISH_NUMBERS[4], ARABIC_NUMBERS[4])
                .replace(ENGLISH_NUMBERS[5], ARABIC_NUMBERS[5])
                .replace(ENGLISH_NUMBERS[6], ARABIC_NUMBERS[6])
                .replace(ENGLISH_NUMBERS[7], ARABIC_NUMBERS[7])
                .replace(ENGLISH_NUMBERS[8], ARABIC_NUMBERS[8])
                .replace(ENGLISH_NUMBERS[9], ARABIC_NUMBERS[9]);
        else return input
                .replace(PERSIAN_NUMBERS[0], ENGLISH_NUMBERS[0])
                .replace(PERSIAN_NUMBERS[1], ENGLISH_NUMBERS[1])
                .replace(PERSIAN_NUMBERS[2], ENGLISH_NUMBERS[2])
                .replace(PERSIAN_NUMBERS[3], ENGLISH_NUMBERS[3])
                .replace(PERSIAN_NUMBERS[4], ENGLISH_NUMBERS[4])
                .replace(PERSIAN_NUMBERS[5], ENGLISH_NUMBERS[5])
                .replace(PERSIAN_NUMBERS[6], ENGLISH_NUMBERS[6])
                .replace(PERSIAN_NUMBERS[7], ENGLISH_NUMBERS[7])
                .replace(PERSIAN_NUMBERS[8], ENGLISH_NUMBERS[8])
                .replace(PERSIAN_NUMBERS[9], ENGLISH_NUMBERS[9])
                .replace(ARABIC_NUMBERS[0], ENGLISH_NUMBERS[0])
                .replace(ARABIC_NUMBERS[1], ENGLISH_NUMBERS[1])
                .replace(ARABIC_NUMBERS[2], ENGLISH_NUMBERS[2])
                .replace(ARABIC_NUMBERS[3], ENGLISH_NUMBERS[3])
                .replace(ARABIC_NUMBERS[4], ENGLISH_NUMBERS[4])
                .replace(ARABIC_NUMBERS[5], ENGLISH_NUMBERS[5])
                .replace(ARABIC_NUMBERS[6], ENGLISH_NUMBERS[6])
                .replace(ARABIC_NUMBERS[7], ENGLISH_NUMBERS[7])
                .replace(ARABIC_NUMBERS[8], ENGLISH_NUMBERS[8])
                .replace(ARABIC_NUMBERS[9], ENGLISH_NUMBERS[9]);
    }
}

Обратите внимание, что здесь мы предположили, что локализация выполняется между английским и персидским или арабским языком, поэтому, если вам также необходимо включить другой язык в критерии замены, просто добавьте отсутствующие предложения замены.

Ответ 12

Я думаю, вместо замены цифр один за другим (который будет работать только для десятичных чисел) вы должны проанализировать свой номер с персидским NumberFormat на число, а затем (при необходимости) использовать английский NumberFormat для его форматирования.