Android开发:String.format() 详解 (string的高级用法)

Android 中String.format()的用法 %s 字符串类型: String s = String.format("程序员:%s","小白"); System.out.println(s); 输出结果: I/System.out: 程序员:小白 %d 整数类型(十进制): private int age=20; String s = String.format("程序员:%s,今年%d岁","小白",age); System.out.println(s); 输出结果: I/System.out: 阅读详情
AI摘要

博客围绕Android开发中使用String.format()解决文本显示问题展开。先提出在TextView显示动态内容的需求,接着通过两个示例展示如何用占位符和该方法格式化字符串,还介绍了重载方法、占位符规则,以及对字符、整数、浮点数、日期时间的格式化方式。

目录

 

一、问题

二、解决

2.1、例1:“我叫小五,今年23岁了,毕业于家里蹲,目前就职于老牛公司,薪资9000”。

2.2、例二:“我叫小五,今年23岁了,毕业于家里蹲,目前就职于老牛公司,薪资9000.00”。

三、扩展

3.1、重载方法

 3.2、占位符

 3.3、对字符、字符串进行格式化

 3.4、对整数进行格式化

 3.5、对浮点数进行格式化

 3.6、对日期、时间进行格式化

3.7、转换符汇总

3.8、标识汇总

3.9、日期转换符

3.10、时间转换符


 

一、问题

在实际开发过程中会有如下的业务:在一个Textview需要显示”我叫xxx,今年xxx岁了,毕业于xxx,目前就职于xxx,薪资xxx” 。
其中的 xxx 是变化的, 每个用户也是不一样的 。
作为老司机的你,遇到这种情况会怎么样解决呢?写多个TextView  ,分别进行赋值吗?这样做的话,怎么能担负得起老司机的称号呢?我们应该遵循Google的开发模式,通过string和String.format()搭配,来实现这一需求。接下来,上车,系好安全带,发车喽~

 

二、解决

2.1、例1:“我叫小五,今年23岁了,毕业于家里蹲,目前就职于老牛公司,薪资9000”。

在string.xml中可以这样写:

<resources>
     <string name="old">我叫%s,今年%d岁了,毕业于%s,目前就职于%s,薪资%.0f</string>
</resources>

在业务代码中这样写:

        LineTextView lineTextView = findViewById(R.id.lineTextView);
        String formatStr = getResources().getString(R.string.old);
        lineTextView.setText(String.format(formatStr, "小五", 23, "家里蹲", "老牛公司", 9000.0));

然后,我们进行分析。

“我叫小五,今年23岁了,毕业于家里蹲,目前就职于老牛公司,薪资9000” ,

首先,把这句话中的变量找出来,分别是“小五”、“23”、“家里蹲”、“老牛公司”、“9000”,这些是我要实时变化的变量。和业务相关,这里我暂定以上5个关键词为变量。

下一步, 区分变量的类型,我这五个变量中有字符串类型(小五 、家里蹲、老牛公司)、整型(23)、和浮点型(9000)。

第三步,用占位符表示变量,%s表示字符串、%d表示整型、%f表示浮点型,重新组装句子为:“我叫%s,今年%d岁了,毕业于%s,目前就职于%s,薪资%f”。

第四步,使用String.format(String format, Object... args)进行格式化,填充内容。String.format(“我叫%s,今年%d岁了,毕业于%s,目前就职于%s,薪资%f”, "小五", 23, "家里蹲", "老牛公司", 9000.0) ,第一个“%s”对应“小五”,第二个“%d”对应23,第三个“%s”对应“家里蹲”,第四个“%s”对应“老牛公司”,第五个“%f”对应9000.0,将实参和占位符形参对应上就可以了。

 

2.2、例二:“我叫小五,今年23岁了,毕业于家里蹲,目前就职于老牛公司,薪资9000.00”。

例二 和 例一  的区别就在于薪资的小数点位数,来看看实现两位小数点该怎么写。

在string.xml中可以这样写:

<resources>
     <string name="old">我叫%s,今年%d岁了,毕业于%s,目前就职于%s,薪资%.2f</string>
</resources>

在业务代码中这样写:

        LineTextView lineTextView = findViewById(R.id.lineTextView);
        String formatStr = getResources().getString(R.string.old);
        lineTextView.setText(String.format(formatStr, "小五", 23, "家里蹲", "老牛公司", 9000.0));

然后,我们进行分析。

细心的你是否已经发现了两者的不同,其实差别只有一点点,在string的语句中 ,例一是这样写的“薪资%.0f”,例二是这样写的“薪资%.2f”。没错,“.”后面的数字代表的就是要保留小数位数,聪明的你学会了吗?

三、扩展

3.1、重载方法

// 使用本地语言(Locale.getDefault())格式化字符串
String String.format(String fmt, Object... args);

// 自定义语言环境格式化字符串
String String.format(Locale locale, String fmt, Object... args);

 3.2、占位符

占位符完整格式为: %[index$][标识][最小宽度][.精度]转换符 。

 针对不同数据类型的格式化,占位符的格式将有所裁剪。

  % ,占位符的其实字符,若要在占位符内部使用%,则需要写成 %% 。

  [index$] ,位置索引从1开始计算,用于指定对索引相应的实参进行格式化并替换掉该占位符。

  [标识] ,用于增强格式化能力,可同时使用多个 [标识] ,但某些标识是不能同时使用的。

  [最小宽度] ,用于设置格式化后的字符串最小长度,若使用 [最小宽度] 而无设置 [标识] ,那么当字符串长度小于最小宽度时,则以左边补空格的方式凑够最小宽度。

  [.精度] ,对于浮点数类型格式化使用,设置保留小数点后多少位。

  转换符 ,用于指定格式化的样式,和限制对应入参的数据类型。

 3.3、对字符、字符串进行格式化

占位符格式为: %[index$][标识][最小宽度]转换符 

示例:将"hello"格式化为"  hello",如下

String raw = "hello";
String str = String.format("%1$7s", raw);
// 简化
//String str = String.format("%7s", raw);

 示例:将"hello"格式化为"hello  ",如下

String raw = "hello";
String str = String.format("%1$-7s", raw);
// 简化
//String str = String.format("%-7s", raw);

可用标识:

   -,在最小宽度内左对齐,右边用空格补上。

可用转换符:

   s,字符串类型。

   c,字符类型,实参必须为char或int、short等可转换为char类型的数据类型,否则抛IllegalFormatConversionException异常。

   b,布尔类型,只要实参为非false的布尔类型,均格式化为字符串true,否则为字符串false。

   n,平台独立的换行符(与通过 System.getProperty("line.separator") 是一样的)

 

 

 3.4、对整数进行格式化

 占位符格式为: %[index$][标识][最小宽度]转换符 

示例:将1显示为0001,如下

int num = 1;
String str = String.format("%04d", num)

  示例:将-1000显示为(1,000),如下

int num = -1000;
String str = String.format("%(,d", num)

可用标识:

 

-,在最小宽度内左对齐,不可以与0标识一起使用。
0,若内容长度不足最小宽度,则在左边用0来填充。
#,对8进制和16进制,8进制前添加一个0,16进制前添加0x。
+,结果总包含一个+或-号。
空格,正数前加空格,负数前加-号。
,,只用与十进制,每3位数字间用,分隔。
(,若结果为负数,则用括号括住,且不显示符号。

 

可用转换符:

b,布尔类型,只要实参为非false的布尔类型,均格式化为字符串true,否则为字符串false。
d,整数类型(十进制)。
x,整数类型(十六进制)。
o,整数类型(八进制)
n,平台独立的换行符, 也可通过System.getProperty("line.separator")获取

 

 3.5、对浮点数进行格式化

占位符格式为: %[index$][标识][最小宽度][.精度]转换符 

示例:

double num = 123.4567899;
String.format("%f %n", num); // 123.456790 
String.format("%g %n", num); // 123.457

可用标识:

-,在最小宽度内左对齐,不可以与0标识一起使用。
0,若内容长度不足最小宽度,则在左边用0来填充。
#,对8进制和16进制,8进制前添加一个0,16进制前添加0x。
+,结果总包含一个+或-号。
空格,正数前加空格,负数前加-号。
,,只用与十进制,每3位数字间用,分隔。
(,若结果为负数,则用括号括住,且不显示符号。

可用转换符:

b,布尔类型,只要实参为非false的布尔类型,均格式化为字符串true,否则为字符串false。
n,平台独立的换行符, 也可通过System.getProperty("line.separator")获取。
f,浮点数型(十进制)。显示9位有效数字,且会进行四舍五入。如99.99。
a,浮点数型(十六进制)。
e,指数类型。如9.38e+5。
g,浮点数型(比%f,%a长度短些,显示6位有效数字,且会进行四舍五入)

 

 

 3.6、对日期、时间进行格式化

占位符格式为:%[index$]t转换符 

示例:

Date now = new Date();
String str = String.format("%tF", now); // 2021-01-10

可用转换符

  1. 日期的转换符

c,星期六 十月 27 14:21:20 CST 2007
F,2007-10-27
D,10/27/07
r,02:25:51 下午
T,14:28:16
R,14:28
b, 月份简称
B, 月份全称
a, 星期简称
A, 星期全称
C, 年前两位(不足两位补零)
y, 年后两位(不足两位补零)
j, 当年的第几天
m, 月份(不足两位补零)
d, 日期(不足两位补零)
e, 日期(不足两位不补零)

  2. 时间的转换符

H, 24小时制的小时(不足两位补零)
k, 24小时制的小时(不足两位不补零)
I, 12小时制的小时(不足两位补零)
i, 12小时制的小时(不足两位不补零)
M, 分钟(不足两位补零)
S, 秒(不足两位补零)
L, 毫秒(不足三位补零)
N, 毫秒(不足9位补零)
p, 小写字母的上午或下午标记,如中文为“下午”,英文为pm
z, 相对于GMT的时区偏移量,如+0800
Z, 时区缩写,如CST
s, 自1970-1-1 00:00:00起经过的秒数
Q, 自1970-1-1 00:00:00起经过的豪秒

3.7、转换符汇总

显示不同转换符实现不同数据类型到字符串的转换,如图所示。

转  换  符

说    明 

示    例

%s

字符串类型

"mingrisoft"

%c

字符类型

'm'

%b

布尔类型

true

%d

整数类型(十进制)

99

%x

整数类型(十六进制)

FF

%o

整数类型(八进制)

77

%f

浮点类型

99.99

%a

十六进制浮点类型

FF.35AE

%e

指数类型

9.38e+5

%g

通用浮点类型(f和e类型中较短的)

 

%h

散列码

 

%%

百分比类型

%

%n

换行符

 

%tx

日期与时间类型(x代表不同的日期与时间转换符

 

 

3.8、标识汇总

标    志

说    明

示    例

结    果

+

为正数或者负数添加符号

("%+d",15)

+15

−

左对齐

("%-5d",15)

|15   |

0

数字前面补0

("%04d", 99)

0099

空格

在整数之前添加指定数量的空格

("% 4d", 99)

|  99|

,

以“,”对数字分组

("%,f", 9999.99)

9,999.990000

(

使用括号包含负数

("%(f", -99.99)

(99.990000)

#

如果是浮点数则包含小数点,如果是16进制或8进制则添加0x或0

("%#x", 99)

("%#o", 99)

0x63

0143

< 

格式化前一个转换符所描述的参数

("%f和%<3.2f", 99.45)

99.450000和99.45

$

被格式化的参数索引

("%1$d,%2$s", 99,"abc")

99,abc

 

3.9、日期转换符

转  换  符

说    明

示    例

c

包括全部日期和时间信息

星期六 十月 27 14:21:20 CST 2007

F

“年-月-日”格式

2007-10-27

D

“月/日/年”格式

10/27/07

r

“HH:MM:SS PM”格式(12时制)

02:25:51 下午

T

“HH:MM:SS”格式(24时制)

14:28:16

R

“HH:MM”格式(24时制)

14:28

 

3.10、时间转换符

转  换  符

说    明

示    例

H

2位数字24时制的小时(不足2位前面补0)

15

I

2位数字12时制的小时(不足2位前面补0)

03

k

2位数字24时制的小时(前面不补0)

15

l

2位数字12时制的小时(前面不补0)

3

M

2位数字的分钟(不足2位前面补0)

03

S

2位数字的秒(不足2位前面补0)

09

L

3位数字的毫秒(不足3位前面补0)

015

N

9位数字的毫秒数(不足9位前面补0)

562000000

p

小写字母的上午或下午标记

中:下午

英:pm

z

相对于GMT的RFC822时区的偏移量

+0800

Z

时区缩写字符串

CST

s

1970-1-1 00:00:00 到现在所经过的秒数

1193468128

Q

1970-1-1 00:00:00 到现在所经过的毫秒数

1193468128984

 

 

LVGL项目内存告急?试试把中文字库放到SD卡里(基于LvglFontTool V0.5) 本文详细介绍了在LVGL嵌入式项目中如何通过将中文字库存储到SD卡来优化内存使用。针对Flash资源有限的MCU,如STM32F103,提供了基于LvglFontTool V0.5的外部字库生成与动态加载方案,适用于多字号、多语言及OTA场景,显著减少固件体积并提升显示灵活性。 阅读详情

相关推荐

从零到一:YOLOv11高帧率模型在RDK X5上的ONNX转换与部署实战

本文详细介绍了将最新的YOLOv11高帧率模型部署到地平线RDK X5开发板的完整实战流程。内容涵盖从PyTorch模型导出ONNX、地平线工具链环境配置与模型量化编译,到编写高效的板端推理代码,并针对高帧率目标进行了后处理优化。通过实战避坑指南,帮助开发者在RDK X5上实现30FPS以上的实时目标检测。

weixin_29089057的博客 139

Android——String.format()方法使用

format格式说明符语法: %[argument_index$][flags][width][.precision]conversion 语法解析: [argument_index$]: "1$" 第1个参数 [flags]: "0" , "" 填充字符,数字用"0"或"",字符串用"" [width]: "10","-10" 最后总宽度10,正数表示在前面添加,负数表示在后面添加。负数的情况一般只在字符串时才用 [.precision] : ".3" 小数

小欣儿的专栏 5302

Mplus实战:三变量随机截距交叉滞后模型(RI-CLPM)语法详解与扩展

本文详细解析了Mplus中三变量随机截距交叉滞后模型(RI-CLPM)的构建原理与语法实现。通过将变量分解为稳定的个体间差异与动态的个体内波动,模型能更纯净地揭示多变量间的纵向交互影响。文章以工作压力、睡眠质量与工作满意度为例,提供了完整的语法模板、关键参数设置(如NOCOV命令、残差相关)及结果解读指南,帮助研究者避开常见误区,稳健分析复杂动态关系。

wdx0123456的博客 926

Android:String.format方法

常规类型的格式化 format()方法有两种重载形式。 format(String format, Object… args) 新字符串使用本地语言环境,制定字符串格式和参数生成格式化的新字符串。 format(Locale locale, String format, Object… args) 使用指定的语言环境,制定字符串格式和参数生成格式化的字符串。 显示不同转换符实现不同数据类型到字符串的转换,如图所示。 转 换 符 说 明 示 例 %s 字符串类型...

baidu_24743861的博客 1318

STC15单片机双串口通信实战:串口2配置与多设备交互

本文详细介绍了STC15单片机双串口通信的实战配置,重点解析串口2的硬件连接、寄存器设置及多设备交互实现。通过实际项目案例和完整代码示例,帮助开发者快速掌握STC15串口2的配置技巧,解决常见通信问题,提升嵌入式系统开发效率。

weixin_29174013的博客 255

手把手教你用CANape调试XCP安全会话:DLL权限管理+四种加密模式实战演示

本文详细介绍了如何使用CANape调试XCP安全会话,重点解析了DLL权限管理的实现与配置方法,并通过实战演示了标定页切换、DAQ测量、STIM旁路和PGM刷写四种典型加密模式的操作流程与调试技巧,帮助工程师深入理解并掌握XCP安全访问机制。

smartcontract5的博客 562

Android String.format 详解

本文详细解析了Android开发中String.format()方法的用法。介绍了其基本语法、格式说明符结构、常用转换符和标志,以及宽度/精度设置。文章还提供了日期格式化示例、参数索引用法和Android实用技巧(如本地化处理和资源文件格式化)。同时指出需要注意参数匹配、类型转换和性能优化问题。最后总结该方法适用于数字/日期格式化、模板填充和国际化处理,建议合理使用以提高代码可读性,但要避免性能敏感场景的过度调用。

要乐观,要积极,多笑,多照镜子 767

详解AUTOSAR:DaVinci Configurator配置CAN和UART数据协议解析器(RH850)(实战篇—1)

通过学习本篇博文项目,将会把所学的DaVinci Configurator知识系统串联起来。

不脱发的程序猿 2810

android安卓-String.format()的详细用法

原帖: link 问题 在开发的时候一段字符串的中间某一部分是需要可变的 比如一个Textview需要显示”XXX用户来自 上海 年龄 21 性别 男” 其中的 XXX 是用户名 每个用户也是不一样的 地区 上海 为可变的string数据 年龄 21 为可变的int数据 性别 男 为可变的string数据 遇到这种情况你们是怎么样解决的呢?把这段字符串保存在常量类里吗?不!我们应该遵循Google的开发模式 <string name="user_info'> %1$s</span>

ruiruiddd的博客 1330

本地部署大模型:dgx-spark-ai项目硬件选型、部署与私有化AI构建指南

大语言模型(LLM)的本地部署是当前AI工程实践中的重要方向,其核心原理在于将模型权重与计算过程完全置于用户可控的硬件环境中。这项技术的核心价值在于实现了数据主权与隐私安全,避免了云端服务的延迟、持续订阅成本及数据外泄风险。从技术实现看,本地部署的关键在于硬件选型与软件环境适配,尤其是NVIDIA GPU的CUDA生态、显存容量与内存带宽的匹配。在应用场景上,本地化部署特别适合对数据敏感性要求高的领域,如企业内部代码助手、金融分析或医疗研究,能够支持私有化模型微调与定制化工作流构建。本文以dgx-spark

weixin_42531579的博客 502

安装anaconda3时出现错误:Failed to link extracted packages to D:\anaconda!...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1479

format输出格式Android,Android String.format()的使用

释放双眼,带上耳机,听听看~!今天,我觉得自己其实也没有什么可以写的东西,不过还是为了保持写博客的习惯,所以在网上找了一些内容。其实也很简单。大家有兴趣可以自己去查找资料。常规类型的格式化String类的format()方法用于创建格式化的字符串以及连接多个字符串对象。熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处。format()方法有两种重载形式。format(Stri...

weixin_35826751的博客 512

uniapp - [全端兼容] 详解实现国际化多语言切换全流程及示例,全部页面中英文多语言随意切换即时生效,语言切换全项目立即变化可自定义新增各国其他语言,uniApp实现中英文语言切换完整源码教程!

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,uniapp多语言实现,uni-app项目使用多语言切换功能,中英文切换,uniapp实现中英文语言切换,uniApp实现国际化多语言切换,中文英文之间的更换,Uniapp使用什么插件能支持多种语言,退出后重启依然能让语言保留,设置可切换中英文,uniapp国际化页面双语/顶部导航双语/根据系统语言双语,标题栏文字原生底部菜单tabbar怎么改,使用vue-i18n国际化多国语言,全平台i18n插件,

🏆 前端领域优质创作者 1万+

android string ',Android String.format()的使用

释放双眼,带上耳机,听听看~!今天,我觉得自己其实也没有什么可以写的东西,不过还是为了保持写博客的习惯,所以在网上找了一些内容。其实也很简单。大家有兴趣可以自己去查找资料。常规类型的格式化String类的format()方法用于创建格式化的字符串以及连接多个字符串对象。熟悉C语言的同学应该记得C语言的sprintf()方法,两者有类似之处。format()方法有两种重载形式。format(Stri...

weixin_30496999的博客 453

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

String.format()的详细用法

问题 在开发的时候一段字符串的中间某一部分是需要可变的 比如一个Textview需要显示”XXX用户来自 上海 年龄 21 性别 男”  其中的 XXX 是用户名 每个用户也是不一样的  地区 上海 为可变的string数据  年龄 21 为可变的int数据  性别 男 为可变的string数据  遇到这种情况你们是怎么样解决的呢?把这段字符串保...

m0_37695902的博客 241

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

string.format()详解

java中: 从 Java 5.0 开始,String类新增了一个强大的字符串格式化方法format()。这个方法到现在用的人还是不多,实在是一种浪费。本文带你快速过一遍这个方法的功能,将来你要用到格式化文本的时候,可能就不需要再借用第三方类库或自己去实现了。 首先看一个简单例子: String formatted = String.format("%s今年%d岁。",...

weixin_38166557的博客 483

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

android 解决String.format多语言存在的问题

今天,简单讲讲android里如何解决String.format在切换语言时存在的问题。之前,我写过一篇博客,讲关于String.format的基本使用,大家如果没有看过,建议看看或者去网上查找资料。但是昨天,发现当手机切换成阿拉伯语时,String.format格式化的数据是一串奇怪的字符串。于是在网上查找资料,最终解决了问题。这里记录一下。这里还是先回顾一下String.format的基本使用...

谢岩的博客 6671

android string ',Android --String.format()用法笔记

Android---String资源文件中通过String.format()(动态改变)字符串资源的显示内容例如:小明来自烟台年龄18岁性别男。其中,“小明”、“烟台”、“18”、“男”,均为可变的,就可以通过String.format()设置。代码:string.xml中%1$s:来自%2$s,年龄%3$d,性别%4$s.MainActivity.javaTextView tx = (TextV...

weixin_39757739的博客 280

Android进步之路三:String.format()的使用

String.format()生成具有特定格式的字符串,函数的第一个参数是格式,第二个参数是对应格式中每个代号的各种数据。由于格式字符串的存在,使得产生的长字符串的可读性大大提高了。这个函数的格式很像C语言中的printf().函数string.format在用来对字符串进行格式化的时候,特别是字符串输出,是功能强大的工具。这个函数有两个参数,你完全可以照C语言的printf来使用这个函数。第一个

fckdenny的专栏 1757

java string format xml,Android --String.format()用法笔记

Android---String资源文件中通过String.format()(动态改变)字符串资源的显示内容例如:小明来自烟台年龄18岁性别男。其中,“小明”、“烟台”、“18”、“男”,均为可变的,就可以通过String.format()设置。代码:string.xml%1$s:来自%2$s,年龄%3$d,性别%4$s.MainActivity.javaTextViewtx=(TextVi...

weixin_30819757的博客 278

android:format="%s",Android --String.format()用法笔记

Android---String资源文件中通过String.format()(动态改变)字符串资源的显示内容例如:小明来自烟台年龄18岁性别男。其中,“小明”、“烟台”、“18”、“男”,均为可变的,就可以通过String.format()设置。代码:string.xml中%1$s:来自%2$s,年龄%3$d,性别%4$s.MainActivity.javaTextView tx = (TextV...

weixin_34175919的博客 354
上一篇: Android开发:Material Design 系列讲解
下一篇: Android开发:DialogFragment的使用
android157
博客等级 码龄9年 193粉丝 95原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值