ANDROID:将输入的数字转换为单词

Tab*_*aba 4 java android

我们的作业表明,我们编写了一个程序,该程序将输入最多6位数字并将数字转换为单词。例如:123 = 123。我毫无头绪!然后我找到了这个网站http://www.rgagnon.com/javadetails/java-0426.html, 但是我不太了解如何将其转换为android。

请帮助我..请

这是我的Main_Activity.xml:

package com.example.torres;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.fragment_main);

    final EditText numbers =  (EditText) findViewById(R.id.editText1);
    final EditText results = (EditText) findViewById(R.id.editText2);

    Button btnConvert = (Button) findViewById(R.id.button1);     
    btnConvert.setOnClickListener(new OnClickListener() {

      @Override
      public void onClick(View arg0) {
         String numberz =numbers.getText().toString();
         try {
             final long number = Long.parseLong(numberz);
             String returnz = Words.convert(number); 
         } catch ( NumberFormatException e) {
             //Toast.makeToast("illegal number or empty number" , toast.long)
         }

                       }  });


        }}
Run Code Online (Sandbox Code Playgroud)

这是我的Words.java

package com.example.torres;

import java.text.DecimalFormat;

public class Words  {




      private static final String[] tensNames = {
        "",
        " ten",
        " twenty",
        " thirty",
        " forty",
        " fifty",
        " sixty",
        " seventy",
        " eighty",
        " ninety"
      };

      private static final String[] numNames = {
        "",
        " one",
        " two",
        " three",
        " four",
        " five",
        " six",
        " seven",
        " eight",
        " nine",
        " ten",
        " eleven",
        " twelve",
        " thirteen",
        " fourteen",
        " fifteen",
        " sixteen",
        " seventeen",
        " eighteen",
        " nineteen"
      };

      private Words() {}


    public static String convertLessThanOneThousand(int number) {
        String soFar;

        if (number % 100 < 20){
          soFar = numNames[number % 100];
          number /= 100;
        }
        else {
          soFar = numNames[number % 10];
          number /= 10;

          soFar = tensNames[number % 10] + soFar;
          number /= 10;
        }
        if (number == 0) return soFar;
        return numNames[number] + " hundred" + soFar;
      }


      public static String convert(long number) {
        // 0 to 999 999 999 999
        if (number == 0) { return "zero"; }

        String snumber = Long.toString(number);

        // pad with "0"
        String mask = "000000000000";
        DecimalFormat df = new DecimalFormat(mask);
        snumber = df.format(number);

        // XXXnnnnnnnnn
        int billions = Integer.parseInt(snumber.substring(0,3));
        // nnnXXXnnnnnn
        int millions  = Integer.parseInt(snumber.substring(3,6));
        // nnnnnnXXXnnn
        int hundredThousands = Integer.parseInt(snumber.substring(6,9));
        // nnnnnnnnnXXX
        int thousands = Integer.parseInt(snumber.substring(9,12));

        String tradBillions;
        switch (billions) {
        case 0:
          tradBillions = "";
          break;
        case 1 :
          tradBillions = convertLessThanOneThousand(billions)
          + " billion ";
          break;
        default :
          tradBillions = convertLessThanOneThousand(billions)
          + " billion ";
        }
        String result =  tradBillions;

        String tradMillions;
        switch (millions) {
        case 0:
          tradMillions = "";
          break;
        case 1 :
          tradMillions = convertLessThanOneThousand(millions)
             + " million ";
          break;
        default :
          tradMillions = convertLessThanOneThousand(millions)
             + " million ";
        }
        result =  result + tradMillions;

        String tradHundredThousands;
        switch (hundredThousands) {
        case 0:
          tradHundredThousands = "";
          break;
        case 1 :
          tradHundredThousands = "one thousand ";
          break;
        default :
          tradHundredThousands = convertLessThanOneThousand(hundredThousands)
             + " thousand ";
        }
        result =  result + tradHundredThousands;

        String tradThousand;
        tradThousand = convertLessThanOneThousand(thousands);
        result =  result + tradThousand;

        // remove extra spaces!
        return result.replaceAll("^\\s+", "").replaceAll("\\b\\s{2,}\\b", " ");}




      }
Run Code Online (Sandbox Code Playgroud)

现在唯一的问题是什么也不会发生

ngl*_*ber 7

在这里发布我的答案,因为可能对其他人有帮助......

import android.icu.text.MessageFormat
import java.util.Locale

fun Double.toWords(language: String, country: String): String {
    val formatter = MessageFormat(
        "{0,spellout,currency}", 
        Locale(language, country)
    )
    return formatter.format(arrayOf(this))
}
Run Code Online (Sandbox Code Playgroud)

你可以这样使用它:

import androidx.compose.ui.text.intl.Locale

// ...

(12345678.99).toWords(Locale.current.language, Locale.current.region)

// OR,

(12345678.99).toWords("en", "US") // For static local
Run Code Online (Sandbox Code Playgroud)

此调用将返回字符串

一千二百三十四万五千六百七十八点九九

参考: https: //developer.android.com/reference/android/icu/text/MessageFormat


Moh*_*ohK 6

您可以 在示例链接中为EnglishNumberToWords创建单独的类。

然后单击按钮,您只需致电

String return_val_in_english =   EnglishNumberToWords.convert(YOUR_NUMBER_TO_CONVERT);
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

public class EnglishNumberToWords {

private static final String[] tensNames = { "", " ten", " twenty", " thirty", " forty",
        " fifty", " sixty", " seventy", " eighty", " ninety" };

private static final String[] numNames = { "", " one", " two", " three", " four", " five",
        " six", " seven", " eight", " nine", " ten", " eleven", " twelve", " thirteen",
        " fourteen", " fifteen", " sixteen", " seventeen", " eighteen", " nineteen" };

private static String convertLessThanOneThousand(int number)
{
    String soFar;

    if (number % 100 < 20)
    {
        soFar = numNames[number % 100];
        number /= 100;
    } else
    {
        soFar = numNames[number % 10];
        number /= 10;

        soFar = tensNames[number % 10] + soFar;
        number /= 10;
    }
    if (number == 0)
        return soFar;
    return numNames[number] + " hundred" + soFar;
}

public static String convert(long number)
{
    // 0 to 999 999 999 999
    if (number == 0)
    {
        return "zero";
    }

    String snumber = Long.toString(number);

    // pad with "0"
    String mask = "000000000000";
    DecimalFormat df = new DecimalFormat(mask);
    snumber = df.format(number);

    // XXXnnnnnnnnn
    int billions = Integer.parseInt(snumber.substring(0, 3));
    // nnnXXXnnnnnn
    int millions = Integer.parseInt(snumber.substring(3, 6));
    // nnnnnnXXXnnn
    int hundredThousands = Integer.parseInt(snumber.substring(6, 9));
    // nnnnnnnnnXXX
    int thousands = Integer.parseInt(snumber.substring(9, 12));

    String tradBillions;
    switch (billions)
    {
        case 0:
            tradBillions = "";
            break;
        case 1:
            tradBillions = convertLessThanOneThousand(billions) + " billion ";
            break;
        default:
            tradBillions = convertLessThanOneThousand(billions) + " billion ";
    }
    String result = tradBillions;

    String tradMillions;
    switch (millions)
    {
        case 0:
            tradMillions = "";
            break;
        case 1:
            tradMillions = convertLessThanOneThousand(millions) + " million ";
            break;
        default:
            tradMillions = convertLessThanOneThousand(millions) + " million ";
    }
    result = result + tradMillions;

    String tradHundredThousands;
    switch (hundredThousands)
    {
        case 0:
            tradHundredThousands = "";
            break;
        case 1:
            tradHundredThousands = "one thousand ";
            break;
        default:
            tradHundredThousands = convertLessThanOneThousand(hundredThousands) + " thousand ";
    }
    result = result + tradHundredThousands;

    String tradThousand;
    tradThousand = convertLessThanOneThousand(thousands);
    result = result + tradThousand;

    // remove extra spaces!
    return result.replaceAll("^\\s+", "").replaceAll("\\b\\s{2,}\\b", " ");
}

}
Run Code Online (Sandbox Code Playgroud)


Chi*_*nki 6

最重要的是,解决方案工作正常,唯一的问题是这不适用于所有语言,因为所有国家/地区都没有将数字转换为单词的相同规则集,因此我们需要为每个国家/地区编写单独的算法,

解决方案

ICU4J是一个国际 Unicode 组件库,允许按照以下步骤进行许多有关语言翻译的实用程序。

  • 第 1 步在您的应用程序级别的 gradle 中添加 ICU4J,如下所示

    依赖{

    实现组:'com.ibm.icu',名称:'icu4j',版本:'51.1'

}

  • 步骤 2定义此方法

    private String convertIntoWords(Double str,String language,String Country) { Locale local = new Locale(language, Country); RuleBasedNumberFormat ruleBasedNumberFormat = new RuleBasedNumberFormat(local, RuleBasedNumberFormat.SPELLOUT); return ruleBasedNumberFormat.format(str); }

  • 第 3 步 现在你可以像下面这样调用这个方法

    double value=165;
    String english=convertIntoWords(value,"en","US"); //one hundred and sixty-five
    /*Peruvion*/
    String Spanish=convertIntoWords(value,"es","PE"); //ciento sesenta y cinco
    
    Run Code Online (Sandbox Code Playgroud)

您可以根据自己的要求更改语言和国家/地区。

享受