Ich muss arabische/persische Zahlen in ihr englisches Äquivalent umwandeln (zum Beispiel “۲” in “2” umwandeln)
Wie kann ich das machen?
Ariya
Ich muss arabische/persische Zahlen in ihr englisches Äquivalent umwandeln (zum Beispiel “۲” in “2” umwandeln)
Wie kann ich das machen?
Peter Lawrey
Ich schlage vor, Sie haben eine zehnstellige Nachschlagezeichenfolge und ersetzen alle Ziffern nacheinander.
public static void main(String... args) {
System.out.println(arabicToDecimal("۴۲"));
}
//used in Persian apps
private static final String extendedArabic = "\u06f0\u06f1\u06f2\u06f3\u06f4\u06f5\u06f6\u06f7\u06f8\u06f9";
//used in Arabic apps
private static final String arabic = "\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669";
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);
}
Drucke
42
Der Grund für die Verwendung der Zeichenfolgen als Nachschlagewerk ist, dass andere Zeichen wie z .
-
,
würde so bleiben wie es ist. Tatsächlich würde eine Dezimalzahl unverändert bleiben.
Dadurch werden die Nummern geändert extended Arabic-indic
Unicode-Unterbereich (۰
bis zu ۹
) ins Englische, das normalerweise zur Darstellung von Zahlen in persischen Anwendungen verwendet wird. Es wird sich auch ändern Arabic-indic
Unicode-Unterbereich, dessen Ziffern von 0x0660 für Null reichen (٠
) bis 0x0669 für neun (۹
). Beachten Sie, dass die Ziffern gleich aussehen, aber einen anderen Unicode haben.
– VSB
21. September 2020 um 15:53 Uhr
Navas Basheer
Ich habe dies erreicht durch java.math.BigDecimal
Klasse, unten ist das Code-Snippet
String arabicNumerals = "۴۲۴۲.۴۲";
String englishNumerals = new BigDecimal(arabic).toString();
System.out.println("Number In Arabic : "+arabicNumerals);
System.out.println("Number In English : "+englishNumerals);
Ergebnis
Number In Arabic : ۴۲۴۲.۴۲
Number In English : 4242.42
Hinweis: Der obige Code funktioniert nicht, wenn andere Zeichen als Ziffern in arabicNumerals vorhanden sind, zum Beispiel: ۴,۲۴۲.۴۲ ergibt a java.lang.NumberFormatException
sodass Sie andere Zeichen mit entfernen können Character.isDigit(char ch)
in einer anderen Logik und verwenden Sie den obigen Code. Alle Normalfälle funktionieren.
Dies ist besser und einfacher (imo) als die gewählte Antwort. Ich wusste es nicht einmal BigDecimal
für nicht-westliche Ziffern gesorgt.
– mohammedkhan
7. Februar 2016 um 22:56 Uhr
Kishath
Ich habe einen einfacheren und schnelleren Weg gefunden, der auch die beiden arabischen Codepages enthält.
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;
}
Es gibt die Zahlen im englischen Format zurück oder umgekehrt, wenn Sie das Ersetzen von ändern.
(“۰”, “0”) bis (“0″,”۰”)
….erzeugt das nicht jedes Mal 20 Strings, wenn Sie es für eine Nummer anrufen? Obwohl ich denke, wenn Sie es nicht in einer massiven for-Schleife verwenden, werden Sie davon kein Problem haben.
– EpicPandaForce
3. Februar 2016 um 11:30 Uhr
Sie rufen die Methode nicht für jede Zahl auf. Sie parsen einfach die Liste der Zahlen als Zeichenfolge “12432475737485” und ersetzen die arabischen Zeichen. Sie könnten auch “gello374828SomeText” parsen und nur die Zahlen in Arabisch konvertieren
– Kischath
17. März 2016 um 7:19 Uhr
Sileria
Probieren Sie das aus, Jungs:
/**
* 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 ) );
}
}
Übrigens gibt es einen Unterschied zwischen arabischen Ziffern und Urdu/Farsi: Arabisch:
private static final char[] ARABIC = {'\u0660', '\u0661', '\u0662', '\u0663', '\u0664', '\u0665', '\u0666', '\u0667', '\u0668', '\u0669'};
Urdu oder Farsi:
private static final char[] URDU_FARSI = {'\u06f0', '\u06f1', '\u06f2', '\u06f3', '\u06f4', '\u06f5', '\u06f6', '\u06f7', '\u06f8', '\u06f9'};
Tomasz Nurkiewicz
Erst funktionieren, dann schön aussehen 😉
public static char persianDigitToEnglish(char persianDigit) {
return (char) (((int)persianDigit) - ((int)'۲' - (int)'2'));
}
Funktioniert für 2
leider kenne ich keine anderen persischen Ziffern, könnten Sie es versuchen?
assertThat(persianDigitToEnglish('۲')).isEqualTo('2');
BEARBEITEN: (beyogen auf Peter Lawrey String-Version, aber verwendet 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'));
}
Mehdi Khademloo
so triviale Antwort:
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;
}
und
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;
}
Character.getNumericValue(ch)
hat mir das Leben gerettet, generische Lösung für jedes Gebietsschema.
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();
}
Beachten Sie, dass “2” immer noch eine arabische Zahl ist.
– TylerH
9. Mai um 14:54 Uhr