问题

我想将以下数字格式化为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相关推荐

  1. java中如何设置字体样式_如何在JAVA中设置字体样式和大小?

    我是新来的Java和无法弄清楚如何格式化我的代码是这样的: 字体"宋体"字体大小"9"大胆如何在JAVA中设置字体样式和大小? 我想整个段落的格式化文本.我真的 ...

  2. java从数组查找指定整数_如何在Java中使用重复项查找整数数组中的K个缺失数字?...

    java从数组查找指定整数 自从我讨论任何编码或算法面试问题以来已经有很长时间了,因此我想重新考虑一种最流行的基于数组的编码问题,即在给定数组中查找缺失的数字. 在进行编程工作面试之前,您可能已经听说 ...

  3. java中md5加密和解密_如何在java中实现md5加密和解密

    如何在java中实现md5加密和解密 关注:273  答案:1  mip版 解决时间 2021-01-19 20:37 提问者精神疯裂 2021-01-19 05:36 如何在java中实现md5加密 ...

  4. java创建一个不可变对象_如何在Java中创建不可变类?

    java创建一个不可变对象 Today we will learn about the immutable class in Java. What are immutable classes? The ...

  5. java 反射父类私有属性值_如何在Java中通过反射访问父类的父类的私有字段? - java...

    在一个API中,我使用的是一个抽象类(A类),该类具有一个私有字段(A.privateField). B类在API中扩展了A类. 我需要扩展B类的实现,即C类,但是我需要A类的privateField ...

  6. java里jlp是什么意思_如何在Java中使用Selp提交表单

    我正在使用 Selenium WebDriver 使系统自动化.语言是 Java . 我已经做了很多事情,但我有一点被卡住了.我需要提交一个包含用户名.密码和重新输入密码字段的表单.但当我填充它们(使 ...

  7. word中 有注释标签吗_如何在Word中注释图像

    word中 有注释标签吗 If you're writing a document that includes images, you may want to add annotations to t ...

  8. php oracle 操作 sql语句中能不能添加数组_如何在PHP中使用Oracle数据库_php

    在php3.0以上版本中,php内置了几乎目前所有的数据库处理函数,包括oracle;在本文中我们通过一个实例来介绍了如何使用这些函数来操作Oracle数据库. PHP提供了2大类API(应用程序接口 ...

  9. mysql中用户权限的授予_如何在MySQL中创建用户和授予权限

    如何创建MySQL用户并授予权限?为了实现良好的安全性,需要为每个应用程序创建单独的用户帐户,而不是root用户访问数据库.这将确保应用程序无法访问其他应用程序的数据库.因此需要mysql管理员(ro ...

  10. python中none是什么类型_如何在Python中”测试”None类型?

    我有一个方法,它有时返回一个非类型的值.那么我怎样才能质疑一个非类型的变量呢?例如,我需要使用if方法 if not new: new = '#' 我知道这是错误的方式,我希望你理解我的意思. 我想这 ...

最新文章

  1. 清华发布《AI芯片技术白皮书》:新计算范式,挑战冯诺依曼、CMOS瓶颈
  2. 《中国人工智能学会通讯》——9.21 基于任务规划的资源卫星智能管控模式
  3. 计算机网络管理云红艳电子版,计算机网络管理pdf
  4. HDU 1254 推箱子 BFS
  5. cf不能全屏win7的解决方法_win7电脑输入法不能打字的解决方法
  6. [javaSE] 标识符大小写
  7. 蓝桥杯 - 试题 J: 砍竹子(双向链表+堆/思维)
  8. 调整和改编赛车游戏——游戏屏幕
  9. Spring框架Runtime介绍(导包)
  10. C#等同于正则表达式的写法
  11. Myeclipse自定义包自动加入
  12. sublime text 2 常用快捷键
  13. laravel nginx_在nginx上用FastCGI解析PHP
  14. Audio / Video Playback
  15. 上传图片时,使用GDI+中重绘方式将CMYK图片转为RGB图片
  16. 2023王道C语言训练营(二叉查找树-顺序查找-折半查找)
  17. 2009英国电子工程学专业排名
  18. Opencv学习笔记 高动态范围 (HDR) 成像
  19. 概率分布函数--二项分布poisson分布
  20. Terraform 基础 定义阿里云资源 VPC、安全组

热门文章

  1. HPC+AI融合发展的挑战和应对方法探讨
  2. 最后7天!阿里云2020云内存数据库峰会现场参会报名中
  3. oracle bip报表乱码,Oracle EBS的BIP报表中显示特殊字体
  4. 【协同任务】基于matlab蚁群算法多组群UAV协同任务路径规划【含Matlab源码 1578期】
  5. 毕设题目:Matlab数字信号处理
  6. 毕设题目:Matlab树叶识别
  7. 【优化算法】灰狼混合布谷鸟优化算法(GWO_CS)【含Matlab源码 1468期】
  8. 【图像检索】基于matlab GUI综合颜色和形状特征图像检索【含Matlab源码 395期】
  9. 【优化预测】基于matlab飞蛾扑火算法优化LSSVM预测【含Matlab源码 110期】
  10. 感受野,以及为什么神经网络可以分清猫是猫,狗是狗的直观理解