最近做比特币相关的行情展示,涉及到这个大量的double类型数据的处理。为了显示整齐好看,同时针对位数什么的进行限制,以及精度控制。顺带说下,这个曲线图用的是PhilJay/MPAndroidChart ,蛮强大的。如果是简单的其实自己也可以开发的,小白打算后面就自己搞一个demo学习下。
误区:一开始小萌新以为是控制精度(小数点后几位),然后进度控制完后如果位数不足就末尾补0. 然后就发现如果是0.0000233这些,如果你进行了进度过滤,那么将会得到0,很尴尬。 哈哈。。。
实际上只需要:
1. substring截取从0开始的几位数(比如七位)
2. 然后进行位数不足, 末尾补0的操作
3.如果获取的double类型发现是0.232323233-E6这样色的,那么就不能直接做字符串截取,会得到0.23232 - 实际上是0.000000232....。 所以这种情况需要BigDecimal进行一个转换才行,然后再做截取
所以粘贴下下相关代码处理: formatNum方法小萌新做了改动。
import android.content.Context;
import java.math.BigDecimal;
import java.util.regex.Pattern;
/*
*@Description: 数字处理工具
*@Author: hl
*@Time: 2018/12/25 17:35
*/
public class NumberFormateTool {
/**
*
* 数字格式化显示
* 小于万默认显示 大于万以1.7万方式显示最大是9999.9万
* 大于亿以1.1亿方式显示最大没有限制都是亿单位
*
*
* @param num 格式化的数字
* @param kBool 是否格式化千,为true,并且num大于999就显示999+,小于等于999就正常显示
* @return
*/
public static String formatNum(Context context, String num, Boolean kBool) {
StringBuffer sb = new StringBuffer();
// if (!StringUtils.isNumeric(num))
// return "0";
if (kBool == null)
kBool = false;
BigDecimal b0 = new BigDecimal("1000");
BigDecimal b1 = new BigDecimal("10000");
BigDecimal b2 = new BigDecimal("100000000");
BigDecimal b3 = new BigDecimal(num);
String formatNumStr = "";
String nuit = "";
// 以千为单位处理
if (kBool) {
if (b3.compareTo(b0) == 0 || b3.compareTo(b0) == 1) {
return "999+";
}
return num;
}
// 以万为单位处理
if (b3.compareTo(b1) == -1) {
sb.append(b3.toString());
} else if ((b3.compareTo(b1) == 0 && b3.compareTo(b1) == 1)
|| b3.compareTo(b2) == -1) {
formatNumStr = b3.divide(b1).toString();
nuit = "万";
} else if (b3.compareTo(b2) == 0 || b3.compareTo(b2) == 1) {
formatNumStr = b3.divide(b2).toString();
nuit = "亿";
}
if (!"".equals(formatNumStr)) {
// int i = formatNumStr.indexOf(".");
// if (i == -1) {
// sb.append(formatNumStr).append(nuit);
// } else {
// i = i + 1;
// String v = formatNumStr.substring(i, i + 1);
// if (!v.equals("0")) {