ps: android 中的字符串有很多有意思的点,用好了可以极大的提高效率,不知道的话要实现某些效果的话,你会抓光头发的,哈哈!
另外关于各种数值的格式化,比如取2位小数,都有很多技巧在内的,值得记录下来,以便今后查阅
本文包含以下:
string 占位符
可以替换 Strings.xml 中声明的固定字符串中的可变部分
string 空格符
在 Strings.xml 中使用空格符替代空格,可以适应所有的设备
string 加载 Html 格式
有时候文字样式不固定,服务器会返回 html 格式的文字,这时就需要我们兼容 html 样式了
float 格式化
保留2为小数,
占位符
占位符符号规则:% + 第几个可变字符数字(1开始) + $s ,中间若是2个占位符挨着使用 : 分割
xml 文件声明如下:
Full Name: %1$s:%2$s
Hello %1$s %2$s, %3$d ages
java 代码修改如下,format 方法中,后面的参数是个可变参数,有几个需要替换的,传入几个就好了:
String sAgeFormat = getResources().getString(R.string.old);
String sFinalAge = String.format(sAgeFormat, 23);
lamdba 表达式如下:
android:text="@{@string/nameFormat(firstName, lastName)}"
空格符
在实际开发中我们长长需要在 Strings.xml 定义字符串,一些在布局中需求对齐的字符可以使用 来占位,注意后面要跟 【 ; 】,具体如下图:
Snip20180119_1.png
string 加载 Html 格式
// font标签前边的 卖家不同意退款原因文字颜色 是布局文件中设置的默认颜色
// font标签中间的 文字的颜色 就是font标签中color='#FF0000'的颜色
String str="卖家不同意退款原因:商品未在指定时间内退回商品未在指定时间内退回商品
未在指定时间内退回商品未在指定时间内退回商品未在指定时间内退回商品
未在指定时间内退回商品未在指定时间内退回商品未在指定时间内退回";
tv_reason = (CustomTextView) findViewById(R.id.tv_reason);
tv_reason.setTextSize(16);
tv_reason.setText(Html.fromHtml(str));
float 保留2为小数
// 1. BigDecimal
public String format1(double value) {
BigDecimal bd = new BigDecimal(value);
bd = bd.setScale(2, RoundingMode.HALF_UP);
return bd.toString();
}
// 2. DecimalFormat
public String format2(double value) {
DecimalFormat df = new DecimalFormat("0.00");
df.setRoundingMode(RoundingMode.HALF_UP);
return df.format(value);
}
// 3. java.util.Formatter
return new Formatter().format("%.2f", value).toString()
// 4. String.format
return String.format("%.2f", value).toString()
数字格式化
上面的内容并不全面,除了指定小数位,我们还可以小数位四舍五入,根据币值类型转换金钱,百分比,涉及到下面几个 API:
NumberFormat
DecimalFormat
NumberFormat
NumberFormat 是所有数值格式的抽象基类,提供格式化和解析数值的接口:
getInstance()、getNumberInstance()
返回当前默认语言环境的通用数值格式
getInstance(Locale)、getNumberInstance(Locale)
返回指定语言环境的通用数值格式
NumberFormat.setMinimumIntegerDigits(int)
设置数的整数部分所允许的最小位数
NumberFormat.setMaximumIntegerDigits(int)
设置数的整数部分所允许的最大位数
NumberFormat.setMinimumFractionDigits(int)
设置最少小数点位数,不足的位数以0补位,超出的话按实际位数输出
NumberFormat.setMaximumFractionDigits(int)
设置最多保留小数位数,不足不补0
NumberFormat nf = NumberFormat.getNumberInstance();
// 设置整数最大个数
d = 1234.0;
nf.setMaximumIntegerDigits(3);
System.out.println(nf.format(d));//234
// 设置小数位个数
d = 12345.6766;
nf.setMaximumFractionDigits(1);
System.out.println(nf.format(d));//12,345.7
DecimalFormat
'#'
无小数,小数部分四舍五入
.#
整数部分不变,一位小数,四舍五入
.##
整数部分不变,二位小数,四舍五入
double d1 = 123456.36987, d2 = 12.3698;
DecimalFormat nf = new DecimalFormat("0000.000");
System.out.println("d1=" + nf.format(d1) + " d2=" + nf.format(d2));//d1=123456.370 d2=0012.370
nf = new DecimalFormat("#");
System.out.println("d1=" + nf.format(d1));//d1=123456
nf = new DecimalFormat(".####");
System.out.println("d1=" + nf.format(d1));//d1=123456.3699
nf = new DecimalFormat("0000,0000.00000");//注意“,”不能放在小数部分
System.out.println("d1=" + nf.format(d1));//d1=0012,3456.36987
货币格式化
//按系统预设的货币格式输出,这里是人民币
NumberFormat nf = NumberFormat.getCurrencyInstance();
System.out.println(nf.format(123.456));//¥123.46
//按指定的货币格式输出,这里是美元
nf = NumberFormat.getCurrencyInstance(Locale.US);
System.out.println(nf.format(123.456));//$123.46
百分比格式化
double d = 123.456;
NumberFormat nf = NumberFormat.getPercentInstance();
System.out.println(nf.format(d));//12,346%
//按指定百分比格式输出,这里是法国格式
nf = NumberFormat.getPercentInstance(Locale.FRANCE);
System.out.println(nf.format(d));//12 346 %