Я не знаю технических деталей, но насколько я могу помнить, переменная является не чем иным как ссылкой от текущего стекового фрейма, и пока эта ссылка не удалена, объект не может быть собран "мусор". Теперь, но явно устанавливая его в NULL, Вы удостоверились, что ссылки не стало. Если Вы не делаете Вы в основном позволяете VM решить, когда эта ссылка очищена, который мог бы или не мог бы быть после выхода из объема (в отличие от C++, если объект расположен на стеке и ДОЛЖЕН быть уничтожен). Это могло бы быть, когда стековый фрейм перезаписывается со следующим. Я не уверен, существует ли на самом деле VM, который делает это.
Короткий ответ, хотя, это является ненужным, метка и развертка, получит его в конечном счете. Это - самое большее вопрос времени.
Я достиг этого с помощью класса 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: Вышеприведенный код не будет работать, если в arabicNumerals есть какие-либо символы, отличные от числовых цифр. Например: ۲۴۲,۲۴۲. [приведет к java.lang.NumberFormatException
, поэтому вы можете удалить другие символы, используя Character.isDigit(char ch)
в другой логике и использовать приведенные выше код. Все нормальные случаи работают очаровательно !!
Добрый день
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();
}
Я думаю, что лучший способ - это изменить Locale на то, что вы хотите, например,
для двойного числа:
NumberFormat fmt = NumberFormat.getNumberInstance(Locale.US);
d = Double.parseDouble(s);
для String:
NumberFormat.getNumberInstance(Locale.US).format(s);
или десятичный формат:
double num;
DecimalFormat df = new DecimalFormat("###.###");
df.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.US));
String s = df.format(num);
Попробуйте это, ребята:
/**
* 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'};