先看以下这个案例,然后在分析:

string.xml 使用xliff,需要导入命名空间 xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">

    <string name="app_name">UI_All</string>

    <!-- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 以下是浮点型系列 -/>
    <!- 显示浮点类型 %n$mf m=1.2小数点后面有两位 -->
    <string name="cost_money" msgid="7137320847812992243">花费<xliff:g id="number">%1$1.2f</xliff:g></string>

    <!-- 显示浮点类型 %n$mf m=1.3小数点后面有三位-->
    <string name="cost_money_2">您消费了<xliff:g id="number2">%1$1.3f</xliff:g></string>

    <!-- 显示浮点类型 %n$mf m=1.9小数点后面有九位-->
    <string name="cost_money_3">您支付了<xliff:g id="number3">%1$1.9f</xliff:g>元钱</string>

    <!-- 显示浮点类型 %n$mf m=9.5小数点后面有五位    9.5的9理解位空格 -->
    <string name="cost_money_4">您扣除了<xliff:g id="number4">%1$9.5f</xliff:g>元钱</string>


    <!-- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 以下是整型系列 -->
    <string name="count">这个办公室有<xliff:g id="count">%1$d</xliff:g>个工程师</string>
    <string name="count2">这个办公室有<xliff:g id="count2">%1$9d</xliff:g>个工程师</string>


    <!-- >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 以下是字符串型系列 -->
    <string name="string">请求网络读取交易信息异常,详情是<xliff:g id="string">%1$s</xliff:g>行号890行</string>
    <string name="string2">此书名是<xliff:g id="string2">%1$9s</xliff:g>设计模式书籍</string>
    
    
    <!-- 多个xliff 由于多个xliff 和 显示类型无关,以下就随意以浮点型 示例 -->
    <string name="total_points">\t第一名<xliff:g id="t1">%1$1.2f</xliff:g>分\n\t第二名<xliff:g id="t2">%2$1.2f</xliff:g></string>
    <string name="welcome">
            欢迎 <xliff:g id="name">%1$s</xliff:g>, 排名 <xliff:g id="num">%2$d</xliff:g>
    </string>

</resources>

 

activity_stirng.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="20dp">

    <!-- 以下是整数系列>>>>>>>>>>>>>>>>>> -->
    <!-- 浮点型,小数点后面三位 -->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/cost_money" />

    <TextView
        android:id="@+id/tv_info1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="浮点型,小数点后面两位"
        />

    <TextView
        android:id="@+id/tv_info2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="浮点型,小数点后面三位"
        />

    <TextView
        android:id="@+id/tv_info3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="浮点型,小数点后面九位"
        />

    <TextView
        android:id="@+id/tv_info4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="浮点型,小数点后面五位,有空格 m=9.5 9代表空格"
        />


    <!-- 以下是整数系列>>>>>>>>>>>>>>>>>> -->
    <TextView
        android:id="@+id/tv_info5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="整数"
        android:layout_marginTop="40dp"
        />

    <TextView
        android:id="@+id/tv_info6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="整数有空格"
        android:layout_marginTop="20dp"
        />


    <!-- 以下是字符串系列>>>>>>>>>>>>>>>>>> -->
    <TextView
        android:id="@+id/tv_info7"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="字符串"
        />

    <TextView
        android:id="@+id/tv_info8"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="字符串 有空格"
        />
    

    <!-- 以下是多个xliff -->
    <TextView
        android:id="@+id/tv_info9"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:text="以下是多个xliff"
        />
    <TextView
        android:id="@+id/tv_info10"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="以下是多个xliff 欢迎"
        />

</LinearLayout>

 

Activity

package liudeli.ui.all;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class StringActivity extends Activity {

    private TextView tv_info1, tv_info2, tv_info3, tv_info4,
            tv_info5, tv_info6, tv_info7, tv_info8, tv_info9,
            tv_info10;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_string);

        tv_info1 = findViewById(R.id.tv_info1);
        tv_info2 = findViewById(R.id.tv_info2);
        tv_info3 = findViewById(R.id.tv_info3);
        tv_info4 = findViewById(R.id.tv_info4);
        tv_info5 = findViewById(R.id.tv_info5);
        tv_info6 = findViewById(R.id.tv_info6);
        tv_info7 = findViewById(R.id.tv_info7);
        tv_info8 = findViewById(R.id.tv_info8);
        tv_info9 = findViewById(R.id.tv_info9);
        tv_info10 = findViewById(R.id.tv_info10);

        initStringData();
    }

    @SuppressLint("StringFormatMatches")
    protected void initStringData() {

        String cost1 = getString(R.string.cost_money, 5.5);
        tv_info1.setText(cost1);

        String cost2 = getString(R.string.cost_money_2, 22.99);
        tv_info2.setText(cost2);

        String cost3 = getString(R.string.cost_money_3, 88.77);
        tv_info3.setText(cost3);

        String cost4 = getString(R.string.cost_money_4, 88.77);
        tv_info4.setText(cost4);

        String cost5 = getString(R.string.count, 200);
        tv_info5.setText(cost5);

        String cost6 = getString(R.string.count2, 600);
        tv_info6.setText(cost6);

        String cost7 = getString(R.string.string, "严重的内存溢出(原因-图片申请控件过大");
        tv_info7.setText(cost7);

        String cost8 = getString(R.string.string2, "大话");
        tv_info8.setText(cost8);

        String cost9 = getString(R.string.total_points, 539.81, 695.99);
        tv_info9.setText(cost9);

        String s = getString(R.string.welcome, "abc", 123);
        tv_info10.setText(s);

    }
}

 

效果:

 

 


 

分析:

%n$md:输出的是整数,n代表是第几个参数,设置m的值可以在输出之前放置空格,也可以设为0m,在输出之前放置m个0 

以下代码会报错❌,因为整数这种方式,m不能等于 9.9 不能是浮点型,可以是9

<string name="count2">这个办公室有<xliff:g id="count2">%1$9.9d</xliff:g>个工程师</string>

以下代码是正确的✅

<string name="count2">这个办公室有<xliff:g id="count2">%1$9d</xliff:g>个工程师</string>

 

%n$mf:输出的是浮点数,n代表是第几个参数,设置m的值可以在输出之前放置空格,设置m的值可以控制小数位数,如m=2.2时,输出格式为00.00

以下代码是正确的✅

<string name="cost_money_4">您扣除了<xliff:g id="number4">%1$9.5f</xliff:g>元钱</string>

以下代码是错误的❌,设置后,无空格效果,m必须是浮点型,整型无效果

<string name="cost_money_4">您扣除了<xliff:g id="number4">%1$9f</xliff:g>元钱</string>

 

%n$ms:输出的是字符串,n代表是第几个参数,设置m的值可以在输出之前放置空格

以下代码是没有空格:%1$s

<string name="string2">此书名是<xliff:g id="string2">%1$s</xliff:g>设计模式书籍</string>

以下代码是有空格的:%1$9s

<string name="string2">此书名是<xliff:g id="string2">%1$9s</xliff:g>设计模式书籍</string>

以下代码是有空格的:%1$9.9s 效果和 %1$9s 是一样的空格量

<string name="string2">此书名是<xliff:g id="string2">%1$9.9s</xliff:g>设计模式书籍</string>