卷瑞士军刀开罐头铁皮盖土豆刀的机器叫什么

java string format 用法 - agun - ITeye技术网站
博客分类:
这两天再做项目的时候遇到一个问题,树形的结构,我的树的结构是没有级别限制的,可以自动扩展的,这样就有一个问题,没有办法直接定位到其多层下级子目录。如果使用oracle的迭代效率很低。
解决办法,增加一个编码,描述出数的结构。(TreeCode).
编码结构为,01.XXXX....
再定义比编码结构的时候用到了 format方法,所以在网上找了一下,整理了点文章,大家可以参考一下。
JDK1.5中,String类新增了一个很有用的静态方法String.format():format(Locale l, String format, Object... args) 使用指定的语言环境、格式字符串和参数返回一个格式化字符串。format(String format, Object... args) 使用指定的格式字符串和参数返回一个格式化字符串。举几个这个方法实用的例子(注释是输出结果):
long now = System.currentTimeMillis();String s = String.format("%tR", now);
// "15:12"
// Current month/day/yearDate d = new Date(now);s = String.format("%tD", d);
// "07/13/04"
s = String.format("%,d", Integer.MAX_VALUE); // "2,147,483,647"
s = String.format("%05d", 123);
// "00123"其实format函数有些类似c语言中printf函数,一些格式字符串与 C 类似,但已进行了某些定制,以适应 Java 语言,并且利用了其中一些特性。此方法提供了对布局对齐和排列的支持,以及对数值、字符串和日期/时间数据的常规格式和特定于语言环境的输出的支持。支持诸如 byte、BigDecimal 和 Calendar 等常见 Java 类型。产生格式化输出的每个方法都需要格式字符串 和参数列表。格式字符串是一个 String,它可以包含固定文本以及一个或多个嵌入的格式说明符。请考虑以下示例:Calendar c = ...;String s = String.format("Duke's Birthday: %1$tm %1$te,%1$tY", c);格式字符串是 format 方法的第一个参数。它包含三个格式说明符 "%1$tm"、"%1$te" 和 "%1$tY",它们指出应该如何处理参数以及在文本的什么地方插入它们。格式字符串的其余部分是包括 "Dukes Birthday: " 和其他任何空格或标点符号的固定文本。 参数列表由传递给位于格式字符串之后的方法的所有参数组成。在上述示例中,参数列表的大小为 1,由新对象 Calendar 组成。1.常规类型、字符类型和数值类型的格式说明符的语法如下:%[argument_index$][flags][width][.precision]conversion可选的 argument_index 是一个十进制整数,用于表明参数在参数列表中的位置。第一个参数由 "1$" 引用,第二个参数由 "2$" 引用,依此类推。可选的 flags 是修改输出格式的字符集。有效标志的集合取决于转换类型。可选 width 是一个非负十进制整数,表明要向输出中写入的最少字符数。可选 precision 是一个非负十进制整数,通常用来限制字符数。特定行为取决于转换类型。所需的 conversion 是一个表明应该如何格式化参数的字符。给定参数的有效转换集合取决于参数的数据类型。2.用来表示日期和时间类型的格式说明符的语法如下:%[argument_index$][flags][width]conversion可选的 argument_index、flags 和 width 的定义同上。所需的 conversion 是一个由两字符组成的序列。第一个字符是 't' 或 'T'。第二个字符表明所使用的格式。这些字符类似于但不完全等同于那些由 GNU date 和 POSIX strftime(3c) 定义的字符。 3.与参数不对应的格式说明符的语法如下:%[flags][width]conversion可选 flags 和 width 的定义同上。所需的 conversion 是一个表明要在输出中所插内容的字符。 转换转换可分为以下几类:1. 常规 - 可应用于任何参数类型2. 字符 - 可应用于表示 Unicode 字符的基本类型:char、Character、byte、Byte、short 和 Short。当 Character.isValidCodePoint(int) 返回 true 时,可将此转换应用于 int 和 Integer 类型3. 数值
1. 整数 - 可应用于 Java 的整数类型:byte、Byte、short、Short、int、Integer、long、Long 和 BigInteger
2. 浮点 - 可用于 Java 的浮点类型:float、Float、double、Double 和 BigDecimal 4. 日期/时间 - 可应用于 Java 的、能够对日期或时间进行编码的类型:long、Long、Calendar 和 Date。5. 百分比 - 产生字面值 '%' ('\u0025')6. 行分隔符 - 产生特定于平台的行分隔符下表总结了受支持的转换。由大写字符(如 'B'、'H'、'S'、'C'、'X'、'E'、'G'、'A' 和 'T')表示的转换与由相应的小写字符的转换等同,根据流行的 Locale 规则将结果转换为大写形式除外。后者等同于 String.toUpperCase() 的以下调用.
如果参数 arg 为 null,则结果为 "false"。如果 arg 是一个 boolean 值或 Boolean,则结果为 String.valueOf() 返回的字符串。否则结果为 "true"。
如果参数 arg 为 null,则结果为 "null"。否则,结果为调用 Integer.toHexString(arg.hashCode()) 得到的结果。
如果参数 arg 为 null,则结果为 "null"。如果 arg 实现 Formattable,则调用 arg.formatTo。否则,结果为调用 arg.toString() 得到的结果。
结果是一个 Unicode 字符
结果被格式化为十进制整数
结果被格式化为八进制整数
结果被格式化为十六进制整数
结果被格式化为用计算机科学记数法表示的十进制数
结果被格式化为十进制数
根据精度和舍入运算后的值,使用计算机科学记数形式或十进制格式对结果进行格式化。
结果被格式化为带有效位数和指数的十六进制浮点数
日期和时间转换字符的前缀。请参阅日期/时间转换。
结果为字面值 '%' ('\u0025')
结果为特定于平台的行分隔符
任何未明确定义为转换的字符都是非法字符,并且都被保留,以供将来扩展使用。日期/时间转换以下日期和时间转换的后缀字符是为 't' 和 'T' 转换定义的。这些类型相似于但不完全等同于那些由 GNU date 和 POSIX strftime(3c) 定义的类型。提供其他转换类型是为了访问特定于 Java 的功能(如将 'L' 用作秒中的毫秒)。以下转换字符用来格式化时间:
24 小时制的小时,被格式化为必要时带前导零的两位数,即 00 - 23。
12 小时制的小时,被格式化为必要时带前导零的两位数,即 01 - 12。
24 小时制的小时,即 0 - 23。
12 小时制的小时,即 1 - 12。
小时中的分钟,被格式化为必要时带前导零的两位数,即 00 - 59。
分钟中的秒,被格式化为必要时带前导零的两位数,即 00 - 60 ("60" 是支持闰秒所需的一个特殊值)。
秒中的毫秒,被格式化为必要时带前导零的三位数,即 000 - 999。
秒中的毫微秒,被格式化为必要时带前导零的九位数,即
特定于语言环境的 上午或下午 标记以小写形式表示,例如 "am" 或 "pm"。使用转换前缀 'T' 可以强行将此输出转换为大写形式。
相对于 GMT 的 RFC 822 格式的数字时区偏移量,例如 -0800。
表示时区缩写形式的字符串。Formatter 的语言环境将取代参数的语言环境(如果有)。
自协调世界时 (UTC) 1970 年 1 月 1 日 00:00:00 至现在所经过的秒数,即 Long.MIN_VALUE/1000 与 Long.MAX_VALUE/1000 之间的差值。
自协调世界时 (UTC) 1970 年 1 月 1 日 00:00:00 至现在所经过的毫秒数,即 Long.MIN_VALUE 与 Long.MAX_VALUE 之间的差值。
以下转换字符用来格式化日期:
特定于语言环境的月份全称,例如 "January" 和 "February"。
特定于语言环境的月份简称,例如 "Jan" 和 "Feb"。
与 'b' 相同。
特定于语言环境的星期几全称,例如 "Sunday" 和 "Monday"
特定于语言环境的星期几简称,例如 "Sun" 和 "Mon"
除以 100 的四位数表示的年份,被格式化为必要时带前导零的两位数,即 00 - 99
年份,被格式化为必要时带前导零的四位数(至少),例如,0092 等于格里高利历的 92 CE。
年份的最后两位数,被格式化为必要时带前导零的两位数,即 00 - 99。
一年中的天数,被格式化为必要时带前导零的三位数,例如,对于格里高利历是 001 - 366。
月份,被格式化为必要时带前导零的两位数,即 01 - 13。
一个月中的天数,被格式化为必要时带前导零两位数,即 01 - 31
一个月中的天数,被格式化为两位数,即 1 - 31。
以下转换字符用于格式化常见的日期/时间组合。
24 小时制的时间,被格式化为 "%tH:%tM"
24 小时制的时间,被格式化为 "%tH:%tM:%tS"。
12 小时制的时间,被格式化为 "%tI:%tM:%tS %Tp"。上午或下午标记 ('%Tp') 的位置可能与语言环境有关。
日期,被格式化为 "%tm/%td/%ty"。
ISO 8601 格式的完整日期,被格式化为 "%tY-%tm-%td"。
日期和时间,被格式化为 "%ta %tb %td %tT %tZ %tY",例如 "Sun Jul 20 16:17:00 EDT 1969"。
任何未明确定义为转换的字符都是非法字符,并且都被保留,以供将来扩展使用。标志下表总结了受支持的标志。y 表示该标志受指示参数类型支持。
结果将是左对齐的。
结果应该使用依赖于转换类型的替换形式
结果总是包括一个符号
对于正值,结果中将包括一个前导空格
结果将用零来填充
结果将包括特定于语言环境的组分隔符
结果将是用圆括号括起来的负数
1 取决于 Formattable 的定义。2 只适用于 'd' 转换。3 只适用于 'o'、'x' 和 'X' 转换。4 对 BigInteger 应用 'd'、'o'、'x' 和 'X' 转换时,或者对 byte 及 Byte、short 及 Short、int 及 Integer、long 及 Long 分别应用 'd' 转换时适用。5 只适用于 'e'、'E'、'f'、'g' 和 'G' 转换。任何未显式定义为标志的字符都是非法字符,并且都被保留,以供扩展使用。 宽度
宽度是将向输出中写入的最少字符数。对于行分隔符转换,不适用宽度,如果提供宽度,则会抛出异常。精度
对于常规参数类型,精度是将向输出中写入的最多字符数。对于浮点转换 'e'、'E' 和 'f',精度是小数点分隔符后的位数。如果转换是 'g' 或 'G',那么精度是舍入计算后所得数值的所有位数。如果转换是 'a' 或 'A',则不必指定精度。对于字符、整数和日期/时间参数类型转换,以及百分比和行分隔符转换,精度是不适用的;如果提供精度,则会抛出异常。参数索引
参数索引是一个十进制整数,用于表明参数在参数列表中的位置。第一个参数由 "1$" 引用,第二个参数由 "2$" 引用,依此类推。根据位置引用参数的另一种方法是使用 '&' ('\u003c') 标志,这将会重用以前格式说明符的参数。例如,以下两条语句产生的字符相同:
Calendar c = ...;String s1 = String.format("Duke's Birthday: %1$tm %1$te,%1$tY", c);String s2 = String.format("Duke's Birthday: %1$tm %&$te,%&$tY", c);
manjingtou
浏览: 80846 次
来自: 深圳
还能更复杂一点?
请问,用ibatis + postgreSQL,存储过程出入一 ...
name like '%'+?+'%'
这样不必对参数再进行 ...
呵呵,我用的就是8.3但是我没有使用 application
我数据库里面有754个 但是没有AddGeometryColu ...Java String字符串的格式化
JDK1.5中,String类新增了一个很有用的静态方法String.format():
format(Locale l, String format, Object... args) 使用指定的语言环境、格式字符串和参数返回一个格式化字符串。
format(String format, Object... args) 使用指定的格式字符串和参数返回一个格式化字符串。format()方法中的字符串格式参数有很多种转换符选项,例如:日期、整数、浮点数等。
一、常规格式化
public static void main(String[] args) {
String str=
str=String.format(&Hi,%s&, &飞龙&);
// 格式化字符串
System.out.println(str);
// 输出字符串变量str的内容
System.out.printf(&字母a的大写是:%c %n&, 'A');
System.out.printf(&3&7的结果是:%b %n&, 3&7);
System.out.printf(&100的一半是:%d %n&, 100/2);
System.out.printf(&100的16进制数是:%x %n&, 100);
System.out.printf(&100的8进制数是:%o %n&, 100);
System.out.printf(&50元的书打8.5折扣是:%f 元%n&, 50*0.85);
System.out.printf(&上面价格的16进制数是:%a %n&, 50*0.85);
System.out.printf(&上面价格的指数表示:%e %n&, 50*0.85);
System.out.printf(&上面价格的指数和浮点数结果的长度较短的是:%g %n&, 50*0.85);
System.out.printf(&上面的折扣是%d%% %n&, 85);
System.out.printf(&字母A的散列码是:%h %n&, 'A');
运行结果:
字母a的大写是:A
3&7的结果是:false
100的一半是:50
100的16进制数是:64
100的8进制数是:144
50元的书打8.5折扣是:42.500000 元
上面价格的16进制数是:0x1.54p5
上面价格的指数表示:4.
上面价格的指数和浮点数结果的长度较短的是:42.5000
上面的折扣是85%
字母A的散列码是:41
这些字符串格式参数不但可以灵活将其他数据类型转换成字符串,而且可以与各种标志组合在一起,生成各种格式的字符串
public static void main(String[] args) {
String str=
str=String.format(&格式参数$的使用:%1$d,%2$s&, 99,&abc&);
System.out.println(str);
System.out.printf(&显示正负数的符号:%+d与%d%n&, 99,-99);
System.out.printf(&最牛的编号是:%03d%n&, 7);
System.out.printf(&Tab键的效果是:% 8d%n&, 7);
System.out.printf(&整数分组的效果是:%,d%n&, 9989997);
System.out.printf(&一本书的价格是:%2.2f元%n&, 49.8);
运行结果:
格式参数$的使用:99,abc
显示正负数的符号:+99与-99
最牛的编号是:007
Tab键的效果是:
整数分组的效果是:9,989,997
一本书的价格是:49.80元
二、常见日期时间格式化
public static void main(String[] args) {
Date date=new Date();
System.out.printf(&全部日期和时间信息:%tc%n&,date);
System.out.printf(&年-月-日格式:%tF%n&,date);
System.out.printf(&月/日/年格式:%tD%n&,date);
System.out.printf(&HH:MM:SS PM格式(12时制):%tr%n&,date);
System.out.printf(&HH:MM:SS格式(24时制):%tT%n&,date);
System.out.printf(&HH:MM格式(24时制):%tR&,date);
运行结果:
全部日期和时间信息:星期日十月28 13:53:24 CST 2007
年-月-日格式:
月/日/年格式:10/28/07
HH:MM:SS PM格式(12时制):01:53:24 下午
HH:MM:SS格式(24时制):13:53:24
HH:MM格式(24时制):13:53
三、格式化日期字符串
public static void main(String[] args) {
Date date=new Date();
String str=String.format(Locale.US,&英文月份简称:%tb&,date);
System.out.println(str);
System.out.printf(&本地月份简称:%tb%n&,date);
str=String.format(Locale.US,&英文月份全称:%tB&,date);
System.out.println(str);
System.out.printf(&本地月份全称:%tB%n&,date);
str=String.format(Locale.US,&英文星期的简称:%ta&,date);
System.out.println(str);
System.out.printf(&本地星期的简称:%tA%n&,date);
System.out.printf(&年的前两位数字(不足两位前面补0):%tC%n&,date);
System.out.printf(&年的后两位数字(不足两位前面补0):%ty%n&,date);
System.out.printf(&一年中的天数(即年的第几天):%tj%n&,date);
System.out.printf(&两位数字的月份(不足两位前面补0):%tm%n&,date);
System.out.printf(&两位数字的日(不足两位前面补0):%td%n&,date);
System.out.printf(&月份的日(前面不补0):%te&,date);
运行结果:
英文月份简称:Oct
本地月份简称:十月
英文月份全称:October
本地月份全称:十月
英文星期的简称:Sun
本地星期的简称:星期日
年的前两位数字(不足两位前面补0):20
年的后两位数字(不足两位前面补0):07
一年中的天数(即年的第几天):301
两位数字的月份(不足两位前面补0):10
两位数字的日(不足两位前面补0):28
月份的日(前面不补0):28
四、格式化时间字符串
public static void main(String[] args) {
Date date=new Date();
// 创建日期对象
System.out.printf(&2位数字24时制的小时(不足2位前面补0):%tH%n&,date);
System.out.printf(&2位数字12时制的小时(不足2位前面补0):%tI%n&,date);
System.out.printf(&2位数字24时制的小时(前面不补0):%tk%n&,date);
System.out.printf(&2位数字12时制的小时(前面不补0):%tl%n&,date);
System.out.printf(&2位数字的分钟(不足2位前面补0):%tM%n&,date);
System.out.printf(&2位数字的秒(不足2位前面补0):%tS%n&,date);
System.out.printf(&3位数字的毫秒(不足3位前面补0):%tL%n&,date);
System.out.printf(&9位数字的毫秒数(不足9位前面补0):%tN%n&,date);
String str=String.format(Locale.US,&小写字母的上午或下午标记(英):%tp&,date);
System.out.println(str);
// 输出字符串变量str的内容
System.out.printf (&小写字母的上午或下午标记(中):%tp%n&,date);
System.out.printf(&相对于GMT的RFC822时区的偏移量:%tz%n&,date);
System.out.printf(&时区缩写字符串:%tZ%n&,date);
System.out.printf(& 00:00:00 到现在所经过的秒数:%ts%n&,date);
System.out.printf(& 00:00:00 到现在所经过的毫秒数:%tQ%n&,date);
运行结果:
2位数字24时制的小时(不足2位前面补0):15
2位数字12时制的小时(不足2位前面补0):03
2位数字24时制的小时(前面不补0):15
2位数字12时制的小时(前面不补0):3
2位数字的分钟(不足2位前面补0):24
2位数字的秒(不足2位前面补0):56
3位数字的毫秒(不足3位前面补0):828
9位数字的毫秒数(不足9位前面补0):
小写字母的上午或下午标记(英):pm
小写字母的上午或下午标记(中):下午
相对于GMT的RFC822时区的偏移量:+0800
时区缩写字符串:CST
00:00:00到现在所经过的秒数:
00:00:00到现在所经过的毫秒数:8
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'格式化写入字符串 函数 - LabVIEW 2011帮助 - National Instruments
您的位置:& &
格式化写入字符串 函数
所属选板:
必需:基础软件包
使字符串路径、枚举型、时间标识、布尔或数值数据格式化为文本。
通过函数,使数据格式化为文本,并使文本写入文件。
格式字符串指定如何使输入参数转换为结果字符串。 默认状态可匹配输入参数的数据类型。时间标识只能按照时间格式,否则返回错误。右键单击函数,在快捷菜单中选择编辑格式字符串,可编辑。通过,可插入不可显示的字符、反斜杠和百分号。
该输入端最多支持255个字符。
初始字符串及其附加参数组成结果字符串。
错误输入(无错误)表明节点运行前发生的错误。该输入将提供功能。
输入1..n指定要转换的输入参数。 输入可以是字符串路径、枚举型、时间标识或任意数值数据类型。函数不能用于数组和簇。
结果字符串包含对初始字符串和格式化输出的连接。
错误输出包含错误信息。该输出将提供功能。
右键单击函数,在快捷菜单中选择添加参数,或都可添加函数中参数的数量。
注:&&如发生错误,源包含格式化写入字符串(arg n)格式的字符串,n为发生错误的第一个参数。
如连线程序框图常量字符串至格式字符串接线端,LabVIEW可在编译时依据格式化字符串的输入确定输出的个数以及每个输出的数据类型。如输出连线的类型与格式字符串指定的数据类型不符,则必须修改输出的类型使VI正常运行。
如配置该函数输出准确的字符串,则无需连线初始字符串。
您的评价!&
&差&&|&&好&
&文档质量?&
&是否解答了您的问题?&
&|&&|&&|&&&&&&&|&&&对于格式化字符串Format的总结
在此,总结下这个变参的功能.
& [ 对齐 ] &[索引:]& [ 占位符(填充符号) ]
& [最小占位宽度 ] & &[
.精度 ] & &[限定符]
&& 标识格式符
(c,s,d,o,f,x,X...)
& [-] 左对齐 & &
&& [#] 16进制下0x开头
& 小数未指定时6位&
& &[0] 填 '0' &
& 字符串的限制宽度
&未指定时默认为空格 & &
&& 或者这样说字符串的限制字符数
&[+] 正负(如为正显示正号)
先了解一下格式符
含义 参数被裁剪为unsigned char类型并作为字符进行打印。
含义 参数作为一个十进制整数打印。如果给出了最小占位宽度而且值的位数小于最小占位宽度位数,前面就用0填充。
参数&unsigned int
参数作为一个无符号值打印,u使用十进制,o使用八进制,x或X使用十六进制,两者的区别是x约定使用abcdef,而X约定使用ABCDEF。
参数&double
参数根据指数形式打印。例如,6.是使用代码e,6.是使用代码E。小数点后面的位数由精度决定,缺省值是6。
参数&double
含义 参数按照的常规浮点格式打印。精度字段决定小数点后面的位数,缺省值是6。
参数&double
参数以%f或%e(如G则%E)的格式打印,取决于它的值。如果指数大于等于-4但小于精度字段就使用%f格式,否则使用指数格式。
含义 打印一个字符串。精度字段可以限定该字符串最大的长度(不足则填充0?)
含义 指针值被转换为一串因编译器而异的可打印字符。这个代码主要是和scanf中的%p代码组合使用。
参数&int *
&&!输出参数!
含义 这个代码是独特的,因为它并不产生任何输出。相反,到目前为止函数已经产生的输出字符数目将被保存到对应的参数中。
参数 (无)
含义 打印一个%字符。
从"%"&作为转义字符开始....
&&delphi&only?
索引指的是Args参数列表中要显示的每一项的序号。
比如:Args是['a',
'c'],那么'a'的索引就是0,而'c'的索引就是1,而且由于只有两项,所以就不会出现大于1的索引值。Format('%2:s %1:s %0:s', ['1st',
'2nd', '3rd']);结果:'3rd 2nd 1st'
&&'-'&左对齐方式
值在字段中左对齐,缺省情况下是右对齐。
占位符(填充符号) ]
&'+'&正负号占位符
当用于一个格式化某个有符号值代码时,如果值非负,正号标志就会给它加上一个正号。如果该值为负,就像往常一样显示一个负号。
& & 在缺省情况(不填)下,正号并不会显示。
'&空格占位符
&含义:只用于转换有符号值的代码。当值非负时,这个标志把一个空格添加到它开始的位置。
&注意这个标志和正号标志是相互排斥的,如果两个同时给出,空格标志便被忽略。
&&&'#'&数字占位符
& & &当在类型为o
之前(如%#o),则会在打印八进制数值前多印一个0。
& & &在类型为x
之前(%#x)则会在打印十六进制数前多印’0x’
&在型态为e、E、f、g或G 之前则会强迫数值打印小数点。
& & &在类型为g
或G之前时则同时保留小数点及小数位数末尾的零。
在...符号下#表示...
&保证产生的值以一个'0'开头
& 在非零值前面加0x前缀(%X则为0X)
& e,E,f & &
& & 确保结果始终包含一个小数点,即使它后面没有数字
和上面的e,E和f代码相同。另外,缀尾的0并不从小数中去除
&'0'& 零占位符
当有指定参数时,无数字的参数将补上0。默认是关闭此旗标,所以一般会打印出空白字符
& &'%'&百分比占位符&delphi&only?
& &含义:在格式字符串中出现“%”字符将导致数字在格式化之前乘以
100。适当的符号插入到数字本身在格式字符串中出现“%”的位置。
& &使用的百分比字符由当前的 NumberFormatInfo
&[最小占位宽度 ]
&&如其含义,当宽度超过这个范围后,这个限制无效
&&当宽度少于最小占位宽度,即用上面的填充字符来填充空下的部分
& 使用*号,表示需要从参数表中获取这个值
&[ .精度 ]
精度以一个句点开头,后面跟一个可选的十进制数。如果未给出整数,精度值为零。
& & 如未给出
[.精度]&这项 ,默认6位小数位.
& 使用*号,表示需要从参数表中获取这个值
& 对于d,i,u,o,x和X类型的转换
& & 此时, "%.+数字"
同& "%0+数字" &左端补零作用
& & 精度字段指定将出现在结果中的 值数字
的最小位数& 并覆盖零标志。
& & 如果转换后的值的位数小于宽度,就在它的前面插入零。
& & 如果值为零且精度也为零,则转换结果就不会产生数字。
& 对于e,E和 f 类型的转换
&精度决定将出现在小数点之后的数字位数。另一种说法是全部数字(不包括小数点)
& 对于g和G类型的转换
& & 它指定将出现在结果中的最大有效位数。
& 对于s类型的转换
& & 精度指定将被转换的最多的字符数。指定取出的字符串长度(低于字符串截断的优先级)
& 如果由一个"*"星号代替
用于表示字段宽度(和/或)精度的十进制整数,那么printf的下一个参数(必须是个整数)就提供宽度(和/或)精度。
& 这些值可以通过计算获得 &
而不必预先指定(预先制定可能是不定的大小)。
h用于d,i,u,o,x,X时,
& &表示参数是
一个(可能是无符号)short型整数
& &表示参数是一个指向short型整数的指针
l用于d,i,u,o,x,X时,
&表示参数是一个(可能是无符号)long型整数
& &表示参数是一个指向long型整数的指针
L用于e,E,f,g,G时,
& &表示参数是一个long double型值
&%lf&貌似能够输出和读取的精度更高(小数点位数更长)
&PS:(&留个问题...scanf(%f)---9.
和&scanf(%lf)---9.E+37)...
scanf函数族
int fscanf (FILE *stream, const char *format, ...);
int scanf (const char *format, ...);
int sscanf (const char *string, const char *format, ...);
当格式化字符串到达末尾或者读取的输入不再匹配格式字符串所指定的类型时,输入就停止。
被转换的输入值的个数作为返回值返回。
如果在任何输入值被转换之前,输入流就已到达尾部,函数就返回EOF。
scanf族中的format字符串参数可能包含下列内容:
空白字符——它们与输入中的零个或多个空白字符匹配,在处理过程中将被忽略。
格式代码——它们指定函数如何解释接下来的输入字符。
其他字符——当任何其他字符出现在格式字符串时,下一个输入字符必须与它匹配。
如果匹配,该输入字符随后就被丢弃。如果不匹配,函数就不再读取直接返回。
&scanf格式代码
& &[ * ] &
& & &[ 宽度 ]
& & & [ 限定符 ]
&跳过这个参数 & &
& & & 接收的字符宽度
星号表示将使转换后的值被丢弃而不是进行存储。
宽度以一个非负的整数给出,它限制将被读取用于转换的输入字符的个数。
如果未给出宽度,函数就连续读入字符直到遇见输入中的下一个空白字符。
限定符用于修改有些格式代码的含义:
&格式符 & &
& d,i,n & &
& & short &
& long & &
& o,u,x & &
& &unsigned short
& & unsigned long
& unsigned long
& e,f,g & &
& & double &
格式符用于指定字符如何被解释:
参数 char *&
含义 读取和存储单个字符。前导空白字符并不跳过。
如果给出宽度,就读取和存储这个数目的字符。字符后面不会添加一个NUL字节。
参数必须指向一个足够大的字符数组。
参数 int *
含义 一个可选的有符号整数被转换。
d把输入解释为十进制数;
i根据它的第一个字符决定值的基数,就像整型字面值常量的表示形式一样。
参数 unsigned *
含义 一个可选的有符号整数被转换,但它按照无符号数存储。
如果使用u,值被解释为十进制数;
如果使用o,值被解释为八进制数;
如果使用x,值被解释为十六进制数。X和x同义。
&e,E,f,g,G
参数 float *
含义 期待一个浮点值。
它的形式必须像一个浮点型字面常量,但小数点并非必须。
参数 char *
含义 读取一串非空白字符。
参数必须指向一个足够大的字符数组。
当发现空白时输入就停止,字符串后面会自动加上NUL终止符。
参数 char *
含义 根据给定组合的字符从输入中读取一串字符。
参数必须指向一个足够大的字符数组。
当遇到第一个不在给定组合中出现的字符时,输入就停止。
字符串后面会自动加上NUL终止符。
代码%[abc]表示字符组合包括a、b和c。
如果列表以一个^字符开头,表示字符组合是所列字符的补集 ,
所以%[^abc]表示字符组合为a、b、c之外的所有字符。
右方括号也可以出现在字符列表中,但它必须是列表的第一个字符。
至于横杠是否用于指定某个范围的字符(例如%[a-z]),则因编译器而异。
参数 void *
含义 输入预期为一串字符,诸如那些由printf函数的%p格式代码所产生的输出。
它的转换方式因编译器而异,但转换结果将和按照上面描述的进行打印所产生的字符的值是相同的。
参数 int *
含义 到目前为止通过这个scanf函数的调用从输入读取的字符数被返回。
%n转换的字符并不计算在scanf函数的返回值之内。它本身并不消耗任何输入。
参数 (无)
含义 %%这个代码与输入中的一个%相匹配,该%符号被丢弃。
scanf支持正则表达式::::
怎样从中取出tom?
char * url="";
char uri[10]={0};
sscanf(url,"%*[^:]:%[^@]",uri);
在softmse (Jake) 的问题贴
http://community.csdn.net/Expert/topic/.xml?temp=.
4321558中 ,
周星星给出了一个很cool的sscanf用例,而后通过学习,发现sscanf真棒,现做一总结。
iios/12DDWDFF@122
获取/和@之间的字符串怎么做
C程序里面有什么函数吗?
周星星的代码:
int main()
const char* s = "iios/12DDWDFF@122";
char buf[20];
sscanf( s, "%*[^/]/%[^@]", buf );
printf( "%s\n", buf );
结果为:12DDWDFF
sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。
函数原型:
int scanf( const char *format [,argument]... );
其中的format可以是一个或多个 {%[*] [width] [{h | l | I64 | L}]type | ' ' |
'\t' | '\n' | 非%符号},
注:{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。
width:宽度,一般可以忽略,用法如:
const char sourceStr[] = "hello, world";
char buf[10] = {0};
sscanf(sourceStr, "%5s", buf); //%5s,只取5个字符
cout && buf&&
结果为:hello
{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节
size,L表示4字节size(double例外),l64表示8字节size。
type :这就很多了,就是%s,%d之类。
%*[width] [{h | l | I64 | L}]type 表示满足该条件的被过滤掉,不会向目标参数中写入值。如:
const char sourceStr[] = "hello, world";
char buf[10] = {0};
sscanf(sourceStr, "%*s%s", buf);
//%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了
cout && buf&&
结果为:world
支持集合操作:
%[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)
%[aB'] 匹配a、B、'中一员,贪婪性
%[^a] 匹配非a的任意字符,贪婪性
是不是感觉眼熟了啊,不错,这和正则表达式很相似,而且仍然支持过滤,即可以有%*[a-z].如:
星星大哥例子回顾:
const char* s = "iios/12DDWDFF@122";
char buf[20];
sscanf( s, "%*[^/]/%[^@]", buf );
printf( "%s\n", buf );
先将 "iios/"过滤掉,再将非'@'的一串内容送到buf中,cool.得到结果。
sscanf() - 从一个字符串中读进与指定格式相符的数据.
Int& sscanf( string str, string fmt,mixed var1,
mixed var2 ... );
int& scanf( const char *format
[,argument]...);
sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。
其中的format可以是一个或多个 {%[*] [width][{h | l | I64 | L}]type | ‘ ‘ | ‘/t‘
| ‘/n‘ | 非%符号}
1、 * 亦可用于格式中, (即%*d 和 %*s) 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)
2、{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。
3、width表示读取宽度。
4、{h | l | I64 | L}:参数的size,通常h表示单字节size,I表示2字节
size,L表示4字节size(double例外),l64表示8字节size。
5、type :这就很多了,就是%s,%d之类。
6、特别的:%*[width] [{h | l | I64 | L}]type表示满足该条件的被过滤掉,不会向目标参数中写入值
支持集合操作:
&&&&%[a-z]
表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)
%[aB‘] 匹配a、B、‘中一员,贪婪性
%[^a] 匹配非a的任意字符,贪婪性
1. 常见用法。
buf[512] = {0};
sscanf("123456 ", "%s", buf);
printf("%s/n",
结果为:123456
2. 取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。
sscanf("123456 ", "%4s", buf);
printf("%s/n",
结果为:1234
3. 取到指定字符为止的字符串。如在下例中,取遇到空格为止字符串。
sscanf("123456 abcdedf", "%[^ ]", buf);
printf("%s/n",
结果为:123456
4.& 取仅包含指定字符集的字符串。如在下例中,取仅包含1到9和小写字母的字符串。
sscanf("123456abcdedfBCDEF", "%[1-9a-z]", buf);
printf("%s/n",
结果为:123456abcdedf
5.& 取到指定字符集为止的字符串。如在下例中,取遇到大写字母为止的字符串。
sscanf("123456abcdedfBCDEF", "%[^A-Z]", buf);
printf("%s/n",
结果为:123456abcdedf
6、给定一个字符串iios/12DDWDFF@122,获取 / 和 @ 之间的字符串,先将
"iios/"过滤掉,再将非‘@‘的一串内容送到buf中
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
printf("%s/n",
结果为:12DDWDFF
7、给定一个字符串““hello, world”,仅保留world。(注意:“,”之后有一空格)
sscanf(“hello,
world”,& "%*s%s",&
printf("%s/n",
结果为:world
%*s表示第一个匹配到的%s被过滤掉,即hello被过滤了
如果没有空格则结果为NULL。
sscanf的功能很类似于正则表达式,
但却没有正则表达式强大,所以如果对于比较复杂的字符串处理,建议使用正则表达式
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 机器铃 砍菜刀 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信