Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将数字转换为单词_Java_Android - Fatal编程技术网

Java 将数字转换为单词

Java 将数字转换为单词,java,android,Java,Android,我有这个清单和代码。我想去掉数字,转换单词。比如160392=100万或79938384472=790亿。 我想,如果我有正确的数字与指数匹配,它会拉出单词,但如果与指数不匹配,它会返回null。除以3,再乘以3,得到最接近的“有效”指数值,如下所示: static public class ScaleUnit{ private int exponent; private String[] names; private ScaleUnit(int

我有这个清单和代码。我想去掉数字,转换单词。比如160392=100万或79938384472=790亿。
我想,如果我有正确的数字与指数匹配,它会拉出单词,但如果与指数不匹配,它会返回null。

除以3,再乘以3,得到最接近的“有效”指数值,如下所示:

 static public class ScaleUnit{
        private int exponent;
        private String[] names;
        private ScaleUnit(int exponent, String...names){
            this.exponent = exponent;
            this.names = names;
        }
        public int getExponent(){
            return exponent;
        }
        public String getName(int index){
            return names[index];
        }
    }
static private ScaleUnit[] Scale_UNITS = new ScaleUnit[]{
            new ScaleUnit(6, "Million"),
            new ScaleUnit(9, "Billion"),
            new ScaleUnit(12, "Trillion"),
            new ScaleUnit(15, "Quadrillion"),
            new ScaleUnit(18, "Quintillion"),
            new ScaleUnit(21, "Sextillion"),
            new ScaleUnit(24, "Septillion"),
            new ScaleUnit(27, "Octillion"),
            new ScaleUnit(30, "Nonillion"),
            new ScaleUnit(33, "Decillion"),
            new ScaleUnit(36, "Undecillion"),
            new ScaleUnit(39, "Duodecillion"),
            new ScaleUnit(42, "Tredecillion"),
            new ScaleUnit(45, "Quattuordecillion"),
            new ScaleUnit(48, "Quinquadecillion"),
            new ScaleUnit(51, "Sedecillion"),
            new ScaleUnit(54, "Septendecillion"),
            new ScaleUnit(57, "Octodecillion"),
            new ScaleUnit(60, "Novendecillion"),
            new ScaleUnit(63, "Vigintillion"),
            new ScaleUnit(66, "Unvigintillion"),
            new ScaleUnit(69, "Duovigintillion"),
            new ScaleUnit(72, "Tresvigintillion"),
            new ScaleUnit(75, "Quattuorvigintillion"),
            new ScaleUnit(78, "Quinquavigintillion"),
            new ScaleUnit(81, "Sesvigintillion"),
            new ScaleUnit(84, "Septemvigintillion"),
            new ScaleUnit(87, "Octovigintillion"),
            new ScaleUnit(90, "Novemvigintillion"),
            new ScaleUnit(93, "Trigintillion"),
            new ScaleUnit(96, "Untrigintillion"),
            new ScaleUnit(99, "Duotrigintillion"),
            new ScaleUnit(102, "Trestrigintillion"),
            new ScaleUnit(105, "Quattuortrigintillion"),
            new ScaleUnit(108, "Quinquatrigintillion"),
            new ScaleUnit(111, "Sestrigintillion"),
            new ScaleUnit(114, "Septentrigintillion"),
            new ScaleUnit(117, "Octotrigintillion"),
            new ScaleUnit(120, "Noventrigintillion"),
            new ScaleUnit(123, "Quadragintillion"),
            new ScaleUnit(153, "Quinquagintillion"),
            new ScaleUnit(183, "Sexagintillion"),
            new ScaleUnit(213, "Septuagintillion"),
            new ScaleUnit(243, "Octogintillion"),
            new ScaleUnit(273, "Nonagintillion"),
            new ScaleUnit(303, "Centillion"),
            new ScaleUnit(306, "Uncentillion"),
            new ScaleUnit(309, "Duocentillion"),
            new ScaleUnit(312, "Trescentillion"),
            new ScaleUnit(333, "Decicentillion"),
            new ScaleUnit(336, "Undecicentillion"),
            new ScaleUnit(363, "Viginticentillion"),
            new ScaleUnit(366, "Unviginticentillion"),
            new ScaleUnit(393, "Trigintacentillion"),
            new ScaleUnit(423, "Quadragintacentillion"),
            new ScaleUnit(453, "Quinquagintacentillion"),
            new ScaleUnit(483, "Sexagintacentillion"),
            new ScaleUnit(513, "Septuagintacentillion"),
            new ScaleUnit(543, "Octogintacentillion"),
            new ScaleUnit(573, "Nonagintacentillion"),
            new ScaleUnit(603, "Ducentillion"),
            new ScaleUnit(903, "Trecentillion"),
            new ScaleUnit(1203, "Quadringentillion"),
            new ScaleUnit(1503, "Quingentillion"),
            new ScaleUnit(1803, "Sescentillion"),
            new ScaleUnit(2103, "Septingentillion"),
            new ScaleUnit(2403, "Octingentillion"),
            new ScaleUnit(2703, "Nongentillion"),
            new ScaleUnit(3003, "Millinillion"),

    };
static public enum Scale {
        SHORT;

        public String getName(int exponent){
            for (ScaleUnit unit: Scale_UNITS){
                if (unit.getExponent() == exponent){
                    return unit.getName(this.ordinal());
                }
            }
            return "";
        }
    }

建议:确保scaleunits数组是按指数排序的(我相信它在您的代码中)。将数字转换为字符串,例如,
“79938384472”
。找到最大指数严格小于字符串长度的比例单位。在本例中,长度为11,因此需要
ScaleUnit(90,“十亿”)
。从该刻度单位中取指数,从字符串末尾去掉这么多字符(
79938384472
变为
79
)。将截断的字符串与比例单位中的名称连接起来。

也许您想采用稍微不同、更清晰的方法:

将指数范围映射到单词

例如,您可以将[6-8]映射为“百万”,“9-11]映射为“十亿”等等。 要实现这一点,您可以利用:

RangeMap expWordRanges=
ImmutableRangeMap.builder()
.put(范围为闭合点(6,9),“百万”)
.put(范围为闭合端(9,12),“十亿”)
//等等。
.build();
字符串字=expWordRanges.get(指数);

然而,尽管分离关注点通常是一件好事,但此处的设计表明,您必须将实际数量分解两次:

  • 将指数传递给单词确定方法
  • 隐式地获取余数-这取决于word方法的结果
  • 例如:

    给定21277185 结果应该是2100万

    你现在会

  • 获取位置数(你的“指数”)=8
  • 将其传递给单词method=000000
  • 计算前缀,例如,通过除以千直到小于千(指数除以3次迭代/四舍五入,向下四舍五入-与指数的第二次接触)。参见@Ole V.V.的答案 查找最大指数严格小于字符串长度的比例单位

  • 步骤3是独立的,可以作为第一步完成。如果现在计算迭代次数并将其与3相乘,则得到需要传递给原始
    getName
    方法的确切数字。此外,您现在不需要将数字拆分两次

    鉴于整数在Java中有一定的局限性,我想您已经在这里处理了字符串,正如@OLEV.V.所建议的那样。因此,分解显然是处理字符串的长度,而不是分别处理10000次幂。这让我回到了我在文章开头提到的解决方案

        public String getName(int exponent){
            exponent = (exponent / 3) * 3;
            for (ScaleUnit unit: Scale_UNITS){
                if (unit.getExponent() == exponent){
                    return unit.getName(this.ordinal());
                }
            }
            return "";
        }
    
    RangeMap<Integer, String> expWordRanges =
         ImmutableRangeMap.builder()
                          .put(Range.closedOpen(6,9), "Million")
                          .put(Range.closedOpen(9,12), "Billion")
                          // etc.
                          .build();
    String word = expWordRanges.get(exponent);