将String转换为java中的另一个语言环境

RYN*_*RYN 27 java locale

嗨,
我需要将阿拉伯语/波斯语数字转换为英语相等(例如将"2"转换为"2")
我该怎么做?

谢谢

Pet*_*rey 32

我建议你有一个十位数的查找字符串,并一次替换所有数字.

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);
}
Run Code Online (Sandbox Code Playgroud)

版画

42
Run Code Online (Sandbox Code Playgroud)

将字符串用作查找的原因是其他字符(例如. - ,将保留原样).实际上十进制数将保持不变.


Nav*_*eer 18

我通过java.math.BigDecimalClass实现了这个,下面是代码片段

String arabicNumerals = "????.??";
String englishNumerals = new BigDecimal(arabic).toString();
System.out.println("Number In Arabic : "+arabicNumerals);
System.out.println("Number In English : "+englishNumerals);
Run Code Online (Sandbox Code Playgroud)

结果

Number In Arabic : ????.??
Number In English : 4242.42
Run Code Online (Sandbox Code Playgroud)

注意:如果在arabicNumerals中有除数字之外的任何字符,则上述代码将不起作用,例如:4,242.42将导致java.lang.NumberFormatException,因此您可以删除Character.isDigit(char ch)在其他逻辑中使用的其他字符并使用上述代码.所有正常情况都很有效!!

美好的一天

  • 这比选择的答案更好,更简单(imo)。我什至不知道“BigDecimal”适用于非西方数字。 (3认同)

Kis*_*ath 10

我找到了一种更简单,更快捷的方法,包括两个阿拉伯语代码页面.

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;
}
Run Code Online (Sandbox Code Playgroud)

如果您更改替换,它将以英文格式返回数字,反之亦然.
("0","0")到("0","0")


Sil*_*ria 8

试试这个家伙:

/**
 * 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 ) );
}
}
Run Code Online (Sandbox Code Playgroud)

BTW阿拉伯语数字与乌尔都语/波斯语之间存在差异:阿拉伯语:

private static final char[] ARABIC     = {'\u0660', '\u0661', '\u0662', '\u0663', '\u0664', '\u0665', '\u0666', '\u0667', '\u0668', '\u0669'};
Run Code Online (Sandbox Code Playgroud)

乌尔都语或波斯语:

private static final char[] URDU_FARSI = {'\u06f0', '\u06f1', '\u06f2', '\u06f3', '\u06f4', '\u06f5', '\u06f6', '\u06f7', '\u06f8', '\u06f9'};
Run Code Online (Sandbox Code Playgroud)


Tom*_*icz 5

首先让它工作,然后让它看起来不错;-)

public static char persianDigitToEnglish(char persianDigit) {
    return (char) (((int)persianDigit) - ((int)'?' - (int)'2'));
}
Run Code Online (Sandbox Code Playgroud)

2不幸的是,我不知道其他波斯数字,你可以尝试一下吗?

assertThat(persianDigitToEnglish('?')).isEqualTo('2');
Run Code Online (Sandbox Code Playgroud)

编辑 :(基于Peter Lawrey字符串版本,但使用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'));
}
Run Code Online (Sandbox Code Playgroud)


Meh*_*loo 5

如此琐碎的答案:

\n\n
public static String convertNumbersToPersian(String str)\n{\n    String answer = str;\n    answer = answer.replace("1","\xd9\xa1");\n    answer = answer.replace("2","\xd9\xa2");\n    answer = answer.replace("3","\xd9\xa3");\n    answer = answer.replace("4","\xd9\xa4");\n    answer = answer.replace("5","\xd9\xa5");\n    answer = answer.replace("6","\xd9\xa6");\n    answer = answer.replace("7","\xd9\xa7");\n    answer = answer.replace("8","\xd9\xa8");\n    answer = answer.replace("9","\xd9\xa9");\n    answer = answer.replace("0","\xd9\xa0");\n    return answer;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n
public static String convertNumbersToEnglish(String str) {\n    String answer = str;\n    answer = answer.replace("\xd9\xa1", "1");\n    answer = answer.replace("\xd9\xa2", "2");\n    answer = answer.replace("\xd9\xa3", "3");\n    answer = answer.replace("\xd9\xa4", "4");\n    answer = answer.replace("\xd9\xa5", "5");\n    answer = answer.replace("\xd9\xa6", "6");\n    answer = answer.replace("\xd9\xa7", "7");\n    answer = answer.replace("\xd9\xa8", "8");\n    answer = answer.replace("\xd9\xa9", "9");\n    answer = answer.replace("\xd9\xa0", "0");\n    return answer;\n}\n
Run Code Online (Sandbox Code Playgroud)\n