Java 将数字转换为单词
我有这个清单和代码。我想去掉数字,转换单词。比如160392=100万或79938384472=790亿。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
我想,如果我有正确的数字与指数匹配,它会拉出单词,但如果与指数不匹配,它会返回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(指数);
然而,尽管分离关注点通常是一件好事,但此处的设计表明,您必须将实际数量分解两次:
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);