Necesito convertir números arábigos/persas a su equivalente en inglés (por ejemplo, convertir “۲” a “2”)
¿Cómo puedo hacer esto?
Ariyan
Necesito convertir números arábigos/persas a su equivalente en inglés (por ejemplo, convertir “۲” a “2”)
¿Cómo puedo hacer esto?
pedro laurey
Le sugiero que tenga una cadena de búsqueda de diez dígitos y reemplace todos los dígitos uno a la vez.
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);
}
huellas dactilares
42
La razón para usar las cadenas como una búsqueda es que otros caracteres como .
-
,
se dejaría como está. De hecho, un número decimal no cambiaría.
Esto cambiará los números en extended Arabic-indic
Subrango Unicode (۰
hasta ۹
) al inglés, que generalmente se usa para la representación de números en aplicaciones persas. También cambiará Arabic-indic
Subrango Unicode, cuyos dígitos van desde 0x0660 para cero (٠
) hasta 0x0669 durante nueve (۹
). Tenga en cuenta que los dígitos tienen el mismo aspecto pero tienen un Unicode diferente.
– VSB
21 de septiembre de 2020 a las 15:53
Basheer de Navas
Logré esto por java.math.BigDecimal
Clase, a continuación se muestra el fragmento de código
String arabicNumerals = "۴۲۴۲.۴۲";
String englishNumerals = new BigDecimal(arabic).toString();
System.out.println("Number In Arabic : "+arabicNumerals);
System.out.println("Number In English : "+englishNumerals);
Resultado
Number In Arabic : ۴۲۴۲.۴۲
Number In English : 4242.42
NÓTESE BIEN: El código anterior no funcionará si hay caracteres que no sean dígitos numéricos en números arábigos, por ejemplo: ۴, ۲ ۴ ۲. ۴ ۲ dará como resultado un java.lang.NumberFormatException
por lo que puede eliminar otros caracteres usando Character.isDigit(char ch)
en otra lógica y use el código anterior. Todos los casos normales están funcionando.
Esto es mejor y más simple (imo) que la respuesta elegida. ni siquiera sabía BigDecimal
atendió a los dígitos no occidentales.
– mohammedkhan
7 febrero 2016 a las 22:56
Cisat
Encontré una forma más simple y rápida que también incluye las dos páginas de códigos árabes.
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;
}
Devolverá los números en formato inglés o viceversa si cambia el reemplazo de.
(“۰”, “0”) a (“0″,”۰”)
….¿eso no crea 20 cadenas cada vez que lo llamas por un número? Aunque supongo que si no lo usa en un bucle for masivo, no tendrá ningún problema con eso.
– EpicPandaForce
03/02/2016 a las 11:30
No llamas al método para cada número. Simplemente analiza la lista de números como una cadena “12432475737485” y reemplaza los caracteres árabes. También podría analizar “gello374828SomeText” y obtener solo los números convertidos a árabe
– Cisat
17 de marzo de 2016 a las 7:19
sileria
Prueba esto chicos:
/**
* 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 ) );
}
}
Por cierto, hay una diferencia entre los dígitos árabes y los urdu/farsi: Árabe:
private static final char[] ARABIC = {'\u0660', '\u0661', '\u0662', '\u0663', '\u0664', '\u0665', '\u0666', '\u0667', '\u0668', '\u0669'};
Urdu o farsi:
private static final char[] URDU_FARSI = {'\u06f0', '\u06f1', '\u06f2', '\u06f3', '\u06f4', '\u06f5', '\u06f6', '\u06f7', '\u06f8', '\u06f9'};
Tomasz Nurkiewicz
Primero haz que funcione, luego haz que se vea bien 😉
public static char persianDigitToEnglish(char persianDigit) {
return (char) (((int)persianDigit) - ((int)'۲' - (int)'2'));
}
Trabaja para 2
lamentablemente no conozco otros dígitos persas, ¿podrías intentarlo?
assertThat(persianDigitToEnglish('۲')).isEqualTo('2');
EDITAR: (Residencia en pedro laurey Versión de cadena, pero utiliza 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
respuesta tan trivial:
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;
}
y
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)
me salvó la vida, solución genérica para cualquier localidad.
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();
}
Tenga en cuenta que “2” sigue siendo un número arábigo.
– TylerH
el dia de ayer