【问题标题】:Change a numeric value as a string type in Persian to Latin将波斯语中的数值作为字符串类型更改为拉丁语
【发布时间】:2020-09-07 04:40:43
【问题描述】:

我想更改数字字符串的本地(将所有字符从源本地更改为目标本地,例如:-fa 到 en- 或 -mm 到 en- 反之亦然),例如,如果我有类似的内容:

String value = "꧱꧲꧳";

在缅甸语中是 123,或者:

String value = "۱۲۳";

这是相同的,但在波斯语中。

想要更改为 123,但使用将局部作为参数的函数,而不是逐个字符地迭代。

以下代码将 'en' 中的数字更改为任何其他本地数字,但它有一些问题,它给出一个双精度作为参数,但我需要传递一个字符串:

NumberFormat fmt = NumberFormat.getNumberInstance(new Locale("fa"));
fmt.setMaximumFractionDigits(100);
String result = fmt.format(123);

【问题讨论】:

  • 您是否提前知道该字符串是缅甸语(缅甸语)还是波斯语,还是必须先检测到?
  • @OleV.V.我提前知道。我想从 google inappbilling-v3 API 获取一个产品列表,它返回设备本地的值,所以我可以确定数字的本地是设备的本地。

标签: java android string


【解决方案1】:

这是内置的。

    Locale myanmar = Locale.forLanguageTag("my-MM");
    NumberFormat format = NumberFormat.getIntegerInstance(myanmar);
    
    String value = "꧱꧲꧳";
    Number result = format.parse(value);
    System.out.println(result);

输出是:

123

根据您的需求量身定制。

将数字转换为字符串称为格式化。相反的转换是解析。并且您需要调用以执行这些转换的方法会相应地命名。

【讨论】:

  • 这有效,但仅适用于没有小数位的数字。我编辑了我的帖子并添加了一个对十进制数字执行相同操作的示例代码。如果您认为可以以更简单的方式进行操作,请发布。
  • 只需使用getInstance() 而不是getIntegerInstance()
  • 好的,最后你应该将指数值转换为数字格式,如:new DecimalFormat("#0.00").format(result)
【解决方案2】:

所以您正在尝试将英语格式的数字转换为波斯语,是吗?这个类为你提供了一堆有用的方法。

tv1.setText(Persian.persianalize(myText);
tv2.setText(Persian.persianalize(myNumber);

还有班级:

public class Persian {

private static String[] persianNumbers = new String[]{ "۰", "۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹" };

public static String persianalize(String text, boolean zeroToText) {
    if (text==null)
        return "";

    if (text.length() == 0) {
        return "";
    }
    String out = "";
    int length = text.length();
    for (int i = 0; i < length; i++) {
        char c = text.charAt(i);
        if ('0' <= c && c <= '9') {
            int number = Integer.parseInt(String.valueOf(c));
            out += persianNumbers[number];
        } else if (c == '٫') {
            out += '،';
        } else {
            out += c;
        }
    }
    if (zeroToText)
        if (out!=null && out.equals("۰"))
            return "صفر";
    return out;
}

public static String convertNumberToEnglish(String num) {
    if (num==null)
        return "";
    String d = num;
    d = d.replace("۰", "0");
    d = d.replace("۱", "1");
    d = d.replace("۲", "2");
    d = d.replace("٣", "3");
    d = d.replace("٤", "4");
    d = d.replace("۵", "5");
    d = d.replace("٦", "6");
    d = d.replace("٧", "7");
    d = d.replace("۸", "8");
    d = d.replace("۹", "9");
    d = d.replace("،", ",");

    return d;
}

public static String persianalize(long value, boolean zeroToText) {
    return persianalize(String.valueOf(value), zeroToText);
}

public static String persianalize(long value) {
    return persianalize(String.valueOf(value), false);
}

public static String persianalize(double value) {
    return persianalize(String.valueOf(value), false);
}

public static String persianalize(String value) {
    return persianalize(value, false);
}

}

【讨论】:

  • 谢谢,但是,正如我所说,我不想将其更改为字符
  • 为什么不呢?这是唯一可行的方法! NumberFormat 等其他方法也在内部使用相同的方法。
  • 是的,但这仅适用于波斯号码,但我想将任何本地更改为任何其他。
【解决方案3】:

你可以在 kotlin 中使用这个扩展

fun String.toJustEnglishNumber(): String {

    var value = ""

    for (character in this.toCharArray()) {

        var str = ""

        when (val ascii = character.toInt()) {

            in 1632..1641 -> {
                // Arabic
                val valueOld = ascii - 1584
                val valueChar = valueOld.toChar()
                str = valueChar.toString()
            }
            in 1776..1785 -> {
                // Persian
                val valueOld = ascii - 1728
                val valueChar = valueOld.toChar()
                str = valueChar.toString()
            }
            in 48..57 -> {
                // English
                str = character.toString()
            }
        }
        value += str
    }
    return value
}

并以这种方式使用

"꧱꧲꧳".toJustEnglishNumber()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    • 2012-01-13
    • 1970-01-01
    • 2014-06-08
    相关资源
    最近更新 更多