add formatSimple

This commit is contained in:
Looly 2021-02-20 10:35:01 +08:00
parent c5530facdf
commit ef3e3f55b5
4 changed files with 329 additions and 302 deletions

View File

@ -11,6 +11,7 @@
* 【core 】 StrUtil增加endWithAnyIgnoreCaseissue#I37I0B@Gitee
* 【crypto 】 Sm2增加getD和getQ方法issue#I37Z4C@Gitee
* 【cache 】 AbstractCache增加keySet方法issue#I37Z4C@Gitee
* 【core 】 NumberWordFormatter增加formatSimple方法pr#1436@Github
### Bug修复
* 【json 】 JSONUtil.isJson方法改变trim策略解决特殊空白符导致判断失败问题

View File

@ -963,6 +963,21 @@ public class Convert {
return NumberWordFormatter.format(number);
}
/**
* 将阿拉伯数字转为精简表示形式例如:
*
* <pre>
* 1200 -> 1.2k
* </pre>
*
* @param number {@link Number}对象
* @return 英文表达式
* @since 5.5.9
*/
public static String numberToSimple(Number number) {
return NumberWordFormatter.formatSimple(number.longValue());
}
/**
* 将阿拉伯数字转为中文表达方式
*

View File

@ -1,14 +1,13 @@
package cn.hutool.core.convert;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
import java.text.DecimalFormat;
/**
* 将浮点数类型的number转换成英语的表达方式 <br>
* 参考博客http://blog.csdn.net/eric_sunah/article/details/8713226
*
* @author Looly
* @author Looly,totalo
* @since 3.0.9
*/
public class NumberWordFormatter {
@ -33,33 +32,37 @@ public class NumberWordFormatter {
if (x != null) {
return format(x.toString());
} else {
return "";
return StrUtil.EMPTY;
}
}
/**
* 将阿拉伯数字转化为简计数单位例如 2100 => 2.1k
* 将阿拉伯数字转化为简计数单位例如 2100 => 2.1k
* 范围默认只到w
* @param value
* @return
*
* @param value 被格式化的数字
* @return 格式化后的数字
* @since 5.5.9
*/
public static String formatValue(long value) {
return formatValue(value, true);
public static String formatSimple(long value) {
return formatSimple(value, true);
}
/**
* 将阿拉伯数字转化为简介计数单位例如 2100 => 2.1k
*
* @param value 对应数字的值
* @param isTwo 控制是否为kw
* @return
* @param isTwo 控制是否为只为kw例如当为{@code false}时返回4.38m{@code true}返回438.43w
* @return 格式化后的数字
* @since 5.5.9
*/
public static String formatValue(long value, boolean isTwo) {
public static String formatSimple(long value, boolean isTwo) {
if (value < 1000) {
return String.valueOf(value);
}
int index = -1;
double res = value * 1.0d;
while (res > 10 && (!isTwo || index < 1)) {
double res = value;
while (res > 10 && (false == isTwo || index < 1)) {
if (res > 1000) {
res = res / 1000;
index++;
@ -69,8 +72,7 @@ public class NumberWordFormatter {
index++;
}
}
DecimalFormat decimalFormat = new DecimalFormat("#.##");
return String.format("%s%s", decimalFormat.format(res), NUMBER_SUFFIX[index]);
return String.format("%s%s", NumberUtil.decimalFormat("#.##", res), NUMBER_SUFFIX[index]);
}
/**

View File

@ -12,14 +12,23 @@ public class NumberWordFormatTest {
String format2 = NumberWordFormatter.format("2100.00");
Assert.assertEquals("TWO THOUSAND ONE HUNDRED AND CENTS ONLY", format2);
}
String format3 = NumberWordFormatter.formatValue(4384324, false);
Assert.assertEquals("4.38m", format3);
@Test
public void formatSimpleTest() {
String format1 = NumberWordFormatter.formatSimple(1200, false);
Assert.assertEquals("1.2k", format1);
String format4 = NumberWordFormatter.formatValue(4384324);
String format2 = NumberWordFormatter.formatSimple(4384324, false);
Assert.assertEquals("4.38m", format2);
String format3 = NumberWordFormatter.formatSimple(4384324, true);
Assert.assertEquals("438.43w", format3);
String format4 = NumberWordFormatter.formatSimple(4384324);
Assert.assertEquals("438.43w", format4);
String format5 = NumberWordFormatter.formatValue(438);
String format5 = NumberWordFormatter.formatSimple(438);
Assert.assertEquals("438", format5);
}
}