java中怎么把系统格式化_如何在java中格式化1200到1.2k
问题
我想将以下数字格式化为java旁边的数字:
1000 to 1k
5821 to 5.8k
10500 to 10k
101800 to 101k
2000000 to 2m
7800000 to 7.8m
92150000 to 92m
123200000 to 123m
右边的数字是长整数,左边的数字是字符串。我应该如何处理这个问题。我已经为此做了很少的算法,但我认为可能已经发明了一些可以做得更好的东西,并且如果我开始处理数十亿和数万亿,则不需要额外的测试:)
其他要求:
格式最多应包含4个字符
以上意味着1.1k可以11.2k不行。相同的7.8m是可以的19.1m不是。小数点前只允许一位数具有小数点。小数点前的两位数表示小数点后的数字。
不需要四舍五入。 (附加k和m显示的数字更多是模拟量表,表示近似而不是精确的逻辑文章。因此,舍入与主要由于变量的性质无关,即使在查看缓存结果时也可以增加或减少几位数。)
#1 热门回答(103 赞)
这是一个适用于任何长值的解决方案,我发现它非常易读(核心逻辑在format方法的底部三行中完成)。
它利用TreeMap找到合适的后缀。令人惊讶的是,它比我之前编写的使用数组的解决方案更有效,并且更难以阅读。
private static final NavigableMap suffixes = new TreeMap<> ();
static {
suffixes.put(1_000L, "k");
suffixes.put(1_000_000L, "M");
suffixes.put(1_000_000_000L, "G");
suffixes.put(1_000_000_000_000L, "T");
suffixes.put(1_000_000_000_000_000L, "P");
suffixes.put(1_000_000_000_000_000_000L, "E");
}
public static String format(long value) {
//Long.MIN_VALUE == -Long.MIN_VALUE so we need an adjustment here
if (value == Long.MIN_VALUE) return format(Long.MIN_VALUE + 1);
if (value < 0) return "-" + format(-value);
if (value < 1000) return Long.toString(value); //deal with easy case
Entry e = suffixes.floorEntry(value);
Long divideBy = e.getKey();
String suffix = e.getValue();
long truncated = value / (divideBy / 10); //the number part of the output times 10
boolean hasDecimal = truncated < 100 && (truncated / 10d) != (truncated / 10);
return hasDecimal ? (truncated / 10d) + suffix : (truncated / 10) + suffix;
}
##测试代码
public static void main(String args[]) {
long[] numbers = {0, 5, 999, 1_000, -5_821, 10_500, -101_800, 2_000_000, -7_800_000, 92_150_000, 123_200_000, 9_999_999, 999_999_999_999_999_999L, 1_230_000_000_000_000L, Long.MIN_VALUE, Long.MAX_VALUE};
String[] expected = {"0", "5", "999", "1k", "-5.8k", "10k", "-101k", "2M", "-7.8M", "92M", "123M", "9.9M", "999P", "1.2P", "-9.2E", "9.2E"};
for (int i = 0; i < numbers.length; i++) {
long n = numbers[i];
String formatted = format(n);
System.out.println(n + " => " + formatted);
if (!formatted.equals(expected[i])) throw new AssertionError("Expected: " + expected[i] + " but found: " + formatted);
}
}
#2 热门回答(88 赞)
我知道,这看起来更像是一个C程序,但它超级轻巧!
public static void main(String args[]) {
long[] numbers = new long[]{1000, 5821, 10500, 101800, 2000000, 7800000, 92150000, 123200000, 9999999};
for(long n : numbers) {
System.out.println(n + " => " + coolFormat(n, 0));
}
}
private static char[] c = new char[]{'k', 'm', 'b', 't'};
/**
* Recursive implementation, invokes itself for each factor of a thousand, increasing the class on each invokation.
* @param n the number to format
* @param iteration in fact this is the class from the array c
* @return a String representing the number n formatted in a cool looking way.
*/
private static String coolFormat(double n, int iteration) {
double d = ((long) n / 100) / 10.0;
boolean isRound = (d * 10) %10 == 0;//true if the decimal part is equal to 0 (then it's trimmed anyway)
return (d < 1000? //this determines the class, i.e. 'k', 'm' etc
((d > 99.9 || isRound || (!isRound && d > 9.99)? //this decides whether to trim the decimals
(int) d * 10 / 10 : d + "" // (int) d * 10 / 10 drops the decimal
) + "" + c[iteration])
: coolFormat(d, iteration+1));
}
它输出:
1000 => 1k
5821 => 5.8k
10500 => 10k
101800 => 101k
2000000 => 2m
7800000 => 7.8m
92150000 => 92m
123200000 => 123m
9999999 => 9.9m
#3 热门回答(40 赞)
这里有一个使用DecimalFormat工程符号的解决方案:
public static void main(String args[]) {
long[] numbers = new long[]{7, 12, 856, 1000, 5821, 10500, 101800, 2000000, 7800000, 92150000, 123200000, 9999999};
for(long number : numbers) {
System.out.println(number + " = " + format(number));
}
}
private static String[] suffix = new String[]{"","k", "m", "b", "t"};
private static int MAX_LENGTH = 4;
private static String format(double number) {
String r = new DecimalFormat("##0E0").format(number);
r = r.replaceAll("E[0-9]", suffix[Character.getNumericValue(r.charAt(r.length() - 1)) / 3]);
while(r.length() > MAX_LENGTH || r.matches("[0-9]+\\.[a-z]")){
r = r.substring(0, r.length()-2) + r.substring(r.length() - 1);
}
return r;
}
输出:
7 = 7
12 = 12
856 = 856
1000 = 1k
5821 = 5.8k
10500 = 10k
101800 = 102k
2000000 = 2m
7800000 = 7.8m
92150000 = 92m
123200000 = 123m
9999999 = 10m
java中怎么把系统格式化_如何在java中格式化1200到1.2k相关推荐
- java中如何设置字体样式_如何在JAVA中设置字体样式和大小?
我是新来的Java和无法弄清楚如何格式化我的代码是这样的: 字体"宋体"字体大小"9"大胆如何在JAVA中设置字体样式和大小? 我想整个段落的格式化文本.我真的 ...
- java从数组查找指定整数_如何在Java中使用重复项查找整数数组中的K个缺失数字?...
java从数组查找指定整数 自从我讨论任何编码或算法面试问题以来已经有很长时间了,因此我想重新考虑一种最流行的基于数组的编码问题,即在给定数组中查找缺失的数字. 在进行编程工作面试之前,您可能已经听说 ...
- java中md5加密和解密_如何在java中实现md5加密和解密
如何在java中实现md5加密和解密 关注:273 答案:1 mip版 解决时间 2021-01-19 20:37 提问者精神疯裂 2021-01-19 05:36 如何在java中实现md5加密 ...
- java创建一个不可变对象_如何在Java中创建不可变类?
java创建一个不可变对象 Today we will learn about the immutable class in Java. What are immutable classes? The ...
- java 反射父类私有属性值_如何在Java中通过反射访问父类的父类的私有字段? - java...
在一个API中,我使用的是一个抽象类(A类),该类具有一个私有字段(A.privateField). B类在API中扩展了A类. 我需要扩展B类的实现,即C类,但是我需要A类的privateField ...
- java里jlp是什么意思_如何在Java中使用Selp提交表单
我正在使用 Selenium WebDriver 使系统自动化.语言是 Java . 我已经做了很多事情,但我有一点被卡住了.我需要提交一个包含用户名.密码和重新输入密码字段的表单.但当我填充它们(使 ...
- word中 有注释标签吗_如何在Word中注释图像
word中 有注释标签吗 If you're writing a document that includes images, you may want to add annotations to t ...
- php oracle 操作 sql语句中能不能添加数组_如何在PHP中使用Oracle数据库_php
在php3.0以上版本中,php内置了几乎目前所有的数据库处理函数,包括oracle;在本文中我们通过一个实例来介绍了如何使用这些函数来操作Oracle数据库. PHP提供了2大类API(应用程序接口 ...
- mysql中用户权限的授予_如何在MySQL中创建用户和授予权限
如何创建MySQL用户并授予权限?为了实现良好的安全性,需要为每个应用程序创建单独的用户帐户,而不是root用户访问数据库.这将确保应用程序无法访问其他应用程序的数据库.因此需要mysql管理员(ro ...
- python中none是什么类型_如何在Python中”测试”None类型?
我有一个方法,它有时返回一个非类型的值.那么我怎样才能质疑一个非类型的变量呢?例如,我需要使用if方法 if not new: new = '#' 我知道这是错误的方式,我希望你理解我的意思. 我想这 ...
最新文章
- 清华发布《AI芯片技术白皮书》:新计算范式,挑战冯诺依曼、CMOS瓶颈
- 《中国人工智能学会通讯》——9.21 基于任务规划的资源卫星智能管控模式
- 计算机网络管理云红艳电子版,计算机网络管理pdf
- HDU 1254 推箱子 BFS
- cf不能全屏win7的解决方法_win7电脑输入法不能打字的解决方法
- [javaSE] 标识符大小写
- 蓝桥杯 - 试题 J: 砍竹子(双向链表+堆/思维)
- 调整和改编赛车游戏——游戏屏幕
- Spring框架Runtime介绍(导包)
- C#等同于正则表达式的写法
- Myeclipse自定义包自动加入
- sublime text 2 常用快捷键
- laravel nginx_在nginx上用FastCGI解析PHP
- Audio / Video Playback
- 上传图片时,使用GDI+中重绘方式将CMYK图片转为RGB图片
- 2023王道C语言训练营(二叉查找树-顺序查找-折半查找)
- 2009英国电子工程学专业排名
- Opencv学习笔记 高动态范围 (HDR) 成像
- 概率分布函数--二项分布poisson分布
- Terraform 基础 定义阿里云资源 VPC、安全组
热门文章
- HPC+AI融合发展的挑战和应对方法探讨
- 最后7天!阿里云2020云内存数据库峰会现场参会报名中
- oracle bip报表乱码,Oracle EBS的BIP报表中显示特殊字体
- 【协同任务】基于matlab蚁群算法多组群UAV协同任务路径规划【含Matlab源码 1578期】
- 毕设题目:Matlab数字信号处理
- 毕设题目:Matlab树叶识别
- 【优化算法】灰狼混合布谷鸟优化算法(GWO_CS)【含Matlab源码 1468期】
- 【图像检索】基于matlab GUI综合颜色和形状特征图像检索【含Matlab源码 395期】
- 【优化预测】基于matlab飞蛾扑火算法优化LSSVM预测【含Matlab源码 110期】
- 感受野,以及为什么神经网络可以分清猫是猫,狗是狗的直观理解