最近很多小伙伴都在问使用.format和格式化带有字段宽度参数的列表这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展DateFormat(日期格式化)、DecimalFormat.
最近很多小伙伴都在问使用.format和格式化带有字段宽度参数的列表这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展Date Format(日期格式化)、DecimalFormat.format()的更快替代方法?、Delphi格式化函数Format、FormatDateTime和FormatFloat、Delphi格式化函数Format、FormatDateTime和FormatFloat详解等相关知识,下面开始了哦!
本文目录一览:- 使用.format()格式化带有字段宽度参数的列表(格式化字符串中可以包含用户输入吗)
- Date Format(日期格式化)
- DecimalFormat.format()的更快替代方法?
- Delphi格式化函数Format、FormatDateTime和FormatFloat
- Delphi格式化函数Format、FormatDateTime和FormatFloat详解
使用.format()格式化带有字段宽度参数的列表(格式化字符串中可以包含用户输入吗)
我最近(终于?)开始使用.format()
它,对此可能有一个模糊的问题。
给定
res = [''Irene Adler'', 35, 24.798]
和
(1) print(''{0[0]:10s} {0[1]:5d} {0[2]:.2f}''.format(res))(2) print(''{:{}s} {:{}d} {:{}f}''.format(res[0], 10, res[1], 5, res[2], .2))
工作出色,并且都可以打印:
Irene Adler 35 24.80Irene Adler 35 24.80
我不知道我可以像(1)中那样处理列表,这很简洁。我以前曾经看过关于字段宽度参数(2)的旧%
格式。
我的问题是想要做这样的事情,将(1)和(2)结合起来:
(3) print(''{0[0]:{}s} {0[1]:{}d} {0[2]:{}f}''.format(res, 10, 5, .2))
但是,我无法做到这一点,即使有可能,我也无法从文档中找出答案。只需提供要打印的列表以及width参数即可。
顺便说一句,我也尝试过这个(没有运气):
args = (10, 5, .2)(4) print(''{0[0]:{}s} {0[1]:{}d} {0[2]:{}f}''.format(res, args))
在这两种情况下,我得到:
D:\Users\blabla\Desktop>python tmp.pyTraceback (most recent call last): File "tmp.py", line 27, in <module> print(''{0[0]:{}s} {0[1]:{}d} {0[2]:{}f}''.format(res, 10, 5, .2))ValueError: cannot switch from manual field specification to automatic field numberingD:\Users\blabla\Desktop>python tmp.pyTraceback (most recent call last): File "tmp.py", line 35, in <module> print(''{0[0]:{}s} {0[1]:{}d} {0[2]:{}f}''.format(res, args))ValueError: cannot switch from manual field specification to automatic field numbering
我也尝试使用zip()
合并两个序列而没有运气。
我的问题是:
我可以指定要进行有效打印的列表,以完成在(3)和(4)中尝试执行的操作吗(显然,如果可能的话,我使用的语法不正确),如果可以,如何执行?
答案1
小编典典错误讯息
ValueError: cannot switch from manual field specification to automatic field numbering
几乎说明了一切:您需要在任何地方提供明确的字段索引,并且
print(''{0[0]:{1}s} {0[1]:{2}d} {0[2]:{3}f}''.format(res, 10, 5, .2))
工作良好。
Date Format(日期格式化)
方法一
// 对Date的扩展,将 Date 转化为指定格式的String
// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符,
// 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
// 例子:
// (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
// (new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
Date.prototype.Format = function(fmt)
{ //author: meizz
var o = {
"M+" : this.getMonth()+1, //月份
"d+" : this.getDate(), //日
"h+" : this.getHours(), //小时
"m+" : this.getMinutes(), //分
"s+" : this.getSeconds(), //秒
"q+" : Math.floor((this.getMonth()+3)/3), //季度
"S" : this.getMilliseconds() //毫秒
};
if(/(y+)/.test(fmt))
fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
for(var k in o)
if(new RegExp("("+ k +")").test(fmt))
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
return fmt;
}
方法二
<mce:script language="<a href="http://lib.csdn.net/base/javascript"replace_word'' title="JavaScript知识库" target=''_blank''color:#df3434; font-weight:bold;''>JavaScript</a>" type="text/javascript"><!--
/**
* 对Date的扩展,将 Date 转化为指定格式的String
* 月(M)、日(d)、12小时(h)、24小时(H)、分(m)、秒(s)、周(E)、季度(q) 可以用 1-2 个占位符
* 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
* eg:
* (new Date()).pattern("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
* (new Date()).pattern("yyyy-MM-dd E HH:mm:ss") ==> 2009-03-10 二 20:09:04
* (new Date()).pattern("yyyy-MM-dd EE hh:mm:ss") ==> 2009-03-10 周二 08:09:04
* (new Date()).pattern("yyyy-MM-dd EEE hh:mm:ss") ==> 2009-03-10 星期二 08:09:04
* (new Date()).pattern("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
*/
Date.prototype.pattern=function(fmt) {
var o = {
"M+" : this.getMonth()+1, //月份
"d+" : this.getDate(), //日
"h+" : this.getHours()%12 == 0 ? 12 : this.getHours()%12, //小时
"H+" : this.getHours(), //小时
"m+" : this.getMinutes(), //分
"s+" : this.getSeconds(), //秒
"q+" : Math.floor((this.getMonth()+3)/3), //季度
"S" : this.getMilliseconds() //毫秒
};
var week = {
"0" : "/u65e5",
"1" : "/u4e00",
"2" : "/u4e8c",
"3" : "/u4e09",
"4" : "/u56db",
"5" : "/u4e94",
"6" : "/u516d"
};
if(/(y+)/.test(fmt)){
fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
}
if(/(E+)/.test(fmt)){
fmt=fmt.replace(RegExp.$1, ((RegExp.$1.length>1) ? (RegExp.$1.length>2 ? "/u661f/u671f" : "/u5468") : "")+week[this.getDay()+""]);
}
for(var k in o){
if(new RegExp("("+ k +")").test(fmt)){
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
}
}
return fmt;
}
var date = new Date();
window.alert(date.pattern("yyyy-MM-dd hh:mm:ss"));
// --></mce:script>
方法三
Date.prototype.format = function(mask) {
var d = this;
var zeroize = function (value, length) {
if (!length) length = 2;
value = String(value);
for (var i = 0, zeros = ''''; i < (length - value.length); i++) {
zeros += ''0'';
}
return zeros + value;
};
return mask.replace(/"[^"]*"|''[^'']*''|/b(?:d{1,4}|m{1,4}|yy(?:yy)?|([hHMstT])/1?|[lLZ])/b/g, function($0) {
switch($0) {
case ''d'': return d.getDate();
case ''dd'': return zeroize(d.getDate());
case ''ddd'': return [''Sun'',''Mon'',''Tue'',''Wed'',''Thr'',''Fri'',''Sat''][d.getDay()];
case ''dddd'': return [''Sunday'',''Monday'',''Tuesday'',''Wednesday'',''Thursday'',''Friday'',''Saturday''][d.getDay()];
case ''M'': return d.getMonth() + 1;
case ''MM'': return zeroize(d.getMonth() + 1);
case ''MMM'': return [''Jan'',''Feb'',''Mar'',''Apr'',''May'',''Jun'',''Jul'',''Aug'',''Sep'',''Oct'',''Nov'',''Dec''][d.getMonth()];
case ''MMMM'': return [''January'',''February'',''March'',''April'',''May'',''June'',''July'',''August'',''September'',''October'',''November'',''December''][d.getMonth()];
case ''yy'': return String(d.getFullYear()).substr(2);
case ''yyyy'': return d.getFullYear();
case ''h'': return d.getHours() % 12 || 12;
case ''hh'': return zeroize(d.getHours() % 12 || 12);
case ''H'': return d.getHours();
case ''HH'': return zeroize(d.getHours());
case ''m'': return d.getMinutes();
case ''mm'': return zeroize(d.getMinutes());
case ''s'': return d.getSeconds();
case ''ss'': return zeroize(d.getSeconds());
case ''l'': return zeroize(d.getMilliseconds(), 3);
case ''L'': var m = d.getMilliseconds();
if (m > 99) m = Math.round(m / 10);
return zeroize(m);
case ''tt'': return d.getHours() < 12 ? ''am'' : ''pm'';
case ''TT'': return d.getHours() < 12 ? ''AM'' : ''PM'';
case ''Z'': return d.toUTCString().match(/[A-Z]+$/);
// Return quoted strings with the surrounding quotes removed
default: return $0.substr(1, $0.length - 2);
}
});
};
DecimalFormat.format()的更快替代方法?
为了提高其性能,我一直在使用VisualVM采样器对我的一个应用程序进行性能分析,最小采样周期为20ms。根据探查器,主线程在该DecimalFormat.format()
方法中花费了将近四分之一的CPU时间。
我正在DecimalFormat.format()
与该0.000000
模式一起使用,以将double
数字“转换”
为正好有六个十进制数字的字符串表示形式。我知道这种方法相对昂贵并且 被 多次调用,但是我对这些结果感到有些惊讶。
这种采样分析器的结果在多大程度上准确?我将如何验证它们-最好不借助仪器分析器?
有比
DecimalFormat
我的用例更快的替代方法吗?推出自己的NumberFormat
子类是否有意义?
更新:
我创建了一个微基准测试来比较以下三种方法的性能:
DecimalFormat.format()
:单个DecimalFormat
对象多次重复使用。String.format()
:多个独立通话。在内部这种方法可以归结为public static String format(String format, Object ... args) {return new Formatter().format(format, args).toString();
}
因此,我希望它的性能非常类似于Formatter.format()
。
Formatter.format()
:单个Formatter
对象多次重复使用。
此方法有点尴尬-Formatter
使用默认构造函数创建的对象会将由该format()
方法创建的所有字符串附加到内部StringBuilder
对象,该内部对象无法正确访问,因此无法清除。结果,多次调用format()
将创建所有结果字符串的
串联 。
要变通解决此问题,我提供了自己的StringBuilder
实例,该实例在与setLength(0)
呼叫一起使用之前已清除。
结果有趣之处:
DecimalFormat.format()
是每次通话1.4us时的基准。String.format()
每次通话2.7us时速度降低了两倍。Formatter.format()
在每次通话时以2.5us的速度降低了两倍。
目前看来,DecimalFormat.format()
在这些替代方案中,它仍然是最快的。
答案1
小编典典您可以编写自己的例程,只要您确切知道自己想要什么。
public static void appendTo6(StringBuilder builder, double d) { if (d < 0) { builder.append(''-''); d = -d; } if (d * 1e6 + 0.5 > Long.MAX_VALUE) { // TODO write a fall back. throw new IllegalArgumentException("number too large"); } long scaled = (long) (d * 1e6 + 0.5); long factor = 1000000; int scale = 7; long scaled2 = scaled / 10; while (factor <= scaled2) { factor *= 10; scale++; } while (scale > 0) { if (scale == 6) builder.append(''.''); long c = scaled / factor % 10; factor /= 10; builder.append((char) (''0'' + c)); scale--; }}@Testpublic void testCases() { for (String s : "-0.000001,0.000009,-0.000010,0.100000,1.100000,10.100000".split(",")) { double d = Double.parseDouble(s); StringBuilder sb = new StringBuilder(); appendTo6(sb, d); assertEquals(s, sb.toString()); }}public static void main(String[] args) { StringBuilder sb = new StringBuilder(); long start = System.nanoTime(); final int runs = 20000000; for (int i = 0; i < runs; i++) { appendTo6(sb, i * 1e-6); sb.setLength(0); } long time = System.nanoTime() - start; System.out.printf("Took %,d ns per append double%n", time / runs);}
版画
Took 128 ns per append double
如果您想获得更高的性能,则可以写入直接的ByteBuffer(假设您想将数据写入某处),因此您产生的数据确实需要复制或编码。(假设还可以)
注意:这仅限于小于9万亿(Long.MAX_VALUE / 1e6)的正/负值。如果这可能是一个问题,则可以添加特殊处理。
Delphi格式化函数Format、FormatDateTime和FormatFloat
总结
以上是小编为你收集整理的Delphi格式化函数Format、FormatDateTime和FormatFloat全部内容。
如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。
Delphi格式化函数Format、FormatDateTime和FormatFloat详解
1.Format 根据指定所需要的格式,格式化字符串。 原型: function Format(const Format: string const Args: array of const): string 例子:
var
s: string;
begin
//指令类型 type
s := Format(''最大整数是: %d; 最小整数是: %d'',[MaxInt,Low(Integer)]);
//返回: 最大整数是: 2147483647; 最小整数是: -2147483648
{ 提示: 格式指令必须以 % 开始, 不区分大小写, %d 代表一个整数; 第二个参数是一个变体数组 }
s := Format(''最大的无负号整数是: %u'',[High(Cardinal)]);
//返回: 最大的无负号整数是: 4294967295
{ %u表示一个无负号整数 }
s := Format(''输入-2的结果是: %u'',[-2]);
//返回: 输入-2的结果是: 4294967294
{ 如果对应 %u 的是个负数, 则返回: 无负号整数最大值 - 这个数的绝对值 + 1 }
s := Format(''%s! %s'',[''你好'',''我是万一'']);
//返回: 你好! 我是万一
{ %s 表示字符串 }
s := Format(''%f'',[Pi]);
//返回: Pi的值是: 3.14
{ %f 表示浮点数, 保留或凑够两位小数点 }
s := Format(''%g'',[01.2345000]);
//返回: 1.2345
{ %g 表示浮点数, 会去掉多余的 0 }
s := Format(''%n'',[12345.6789]);
//返回: 12,345.68
{ %n 表示浮点数, 整数部分使用千位分隔符, 保留两位小数点 }
s := Format(''%m'',[12345.6789]);
//返回: ¥12,345.68
{ %m 表示浮点数, 加货币记号, 转换结果取决于系统的地域设置 }
s := Format(''%e'',[12345.6789]);
//返回: 1.23456789000000E+004
{ %e 用科学计数法表示整数或浮点数 }
s := Format(''%p'',[@Self]);
//返回: 0012F5BC
{ %p 表示指针地址, 用十六进制表示 }
s := Format(''%x'',[255]);
//返回: FF
{ %x 用十六进制表示一个整数 }
//Index
s := Format(''%s%s'',[''万'',''一'']);
s := Format(''%0:s%1:s'',[''万'',''一'']);
//返回: 万一
{ 上面两行的结果是一样的, 0: 对应数组中的第一个值; 1: 对应数组中的第二个值 }
s := Format(''%1:s%0:s'',[''万'',''一'']);
//返回: 一万
{ 翻转了一下顺序 }
s := Format(''%1:s%0:s%0:s%1:s'',[''万'',''一'']);
//返回: 一万万一
{ 反复使用 }
//Width 与对齐方式
s := Format(''%d,%8d,%d'',[1,2,3]);
//返回: 1, 2,3
{ 给第二个值指定了8个字符的宽度, 缺少的用空格填充; 如果指定少了则无效 }
s := Format(''%d,%-8d,%d'',[1,2,3]);
//返回: 1,2 ,3
{ - 表示左对齐, 默认是右对齐的; - 符号在 Width 前面、Index 后面 }
//指定精度 prec
s := Format(''%.9f'',[Pi]);
//返回: 3.141592654
{ 指定小数点的位数, 取值范围1-9, 输入0也当1用 }
s := Format(''%.5d'',[12]);
//返回: 00012
{ 这是给整数指定位数, 如果小了则无效 }
s := Format(''%.3s'',[''Format'']);
//返回: For
{ 给字符串指定位数, 如果大了则无效 }
s := Format(''%.3e'',[123.456]);
//返回: 1.23E+002
{ 给科学计数法指定位数 }
//指令顺序:
{ "%" [index ":"] ["-"] [width] ["." prec] type }
ShowMessage(s);
end;
2.FormatDateTime 格式化日期值 原型:
function FormatDateTime(const Format: string DateTime: TDateTime): string 例子:
var
s: string;
begin
//FormatDateTime 的参数1是 String 格式指令, 参数2是 TDateTime 类型的时间
s := FormatDateTime(''c'', Now); {返回: 2007-12-18 23:56:05}
{指令 c 表示用短格式显示日期与时间}
s := FormatDateTime(''d'', Now); {返回: 19}
s := FormatDateTime(''d'', StrToDateTime(''2008-1-1'')); {返回: 1}
{d 表示日期}
s := FormatDateTime(''dd'', Now); {返回: 19}
s := FormatDateTime(''dd'', StrToDateTime(''2008-1-1'')); {返回: 01}
{dd 表示双位日期}
s := FormatDateTime(''ddd'', Now); {返回: 星期三}
s := FormatDateTime(''dddd'', Now); {返回: 星期三}
{ddd 与 dddd 表示星期; 可能对不同的语种会有区别}
s := FormatDateTime(''ddddd'', Now); {返回: 2007-12-19}
{ddddd 五个 d 表示短格式日期}
s := FormatDateTime(''dddddd'', Now); {返回: 2007年12月19日}
{dddddd 六个 d 表示长格式日期}
s := FormatDateTime(''e'', Now); {返回: 7}
{e 表示年, 1位}
s := FormatDateTime(''ee'', Now); {返回: 07}
{ee 表示年, 2位}
s := FormatDateTime(''eee'', Now); {返回: 2007}
s := FormatDateTime(''eeee'', Now); {返回: 2007}
{eee 与 eeee 返回4位数年}
s := FormatDateTime(''m'', Now); {返回: 12}
{m 表示月, 1位}
s := FormatDateTime(''mm'', StrToDateTime(''2008-1-1'')); {返回: 01}
{mm 表示月, 2位}
s := FormatDateTime(''mmm'', Now); {返回: 十二月}
s := FormatDateTime(''mmmm'', Now); {返回: 十二月}
{mmm 与 mmmm 表示长格式月}
s := FormatDateTime(''y'', Now); {返回: 07}
s := FormatDateTime(''yy'', Now); {返回: 07}
s := FormatDateTime(''yyy'', Now); {返回: 2007}
s := FormatDateTime(''yyyy'', Now); {返回: 2007}
{y yy yyy yyyy 表示年; 和 e 略有不同}
s := FormatDateTime(''t'', Now); {返回: 0:21}
s := FormatDateTime(''tt'', Now); {返回: 0:22:13}
{t tt 表示时间}
s := FormatDateTime(''ampm'', Now); {返回: 上午}
s := FormatDateTime(''tampm'', Now); {返回: 0:24 上午}
{ampm 表示上午、下午}
s := FormatDateTime(''h'', StrToDateTime(''2007-12-30 9:58:06'')); {返回: 9}
s := FormatDateTime(''hh'', StrToDateTime(''2007-12-30 9:58:06'')); {返回: 09}
{h hh 表示时}
s := FormatDateTime(''n'', StrToDateTime(''2007-12-30 9:58:06'')); {返回: 58}
s := FormatDateTime(''nn'', StrToDateTime(''2007-12-30 9:58:06'')); {返回: 58}
{n nn 表示分}
s := FormatDateTime(''s'', StrToDateTime(''2007-12-30 9:58:06'')); {返回: 6}
s := FormatDateTime(''ss'', StrToDateTime(''2007-12-30 9:58:06'')); {返回: 06}
{s ss 表示秒}
s := FormatDateTime(''z'', Now); {返回: 24}
s := FormatDateTime(''zz'', Now); {返回: 524}
s := FormatDateTime(''zzz'', Now); {返回: 524}
{z zz zzz 表示毫秒}
s := FormatDateTime(''yy/mm/dd'', Now); {返回: 07/12/19}
s := FormatDateTime(''yy/mm/dd'', Now); {返回: 07-12-19}
s := FormatDateTime(''yy-mm-dd'', Now); {返回: 07-12-19}
s := FormatDateTime(''yy*mm*dd'', Now); {返回: 07*12*19}
{使用分隔符, - 是默认的, / 是与 - 等效的, 假如我非要用 / 显示呢?}
s := FormatDateTime(''yy"/"mm"/"dd'', Now); {返回: 07/12/19}
s := FormatDateTime(''"当前时间是: "yyyy-m-d h:n:s:zz'', Now);
{返回: 当前时间是: 2007-12-19 0:47:16:576}
{混入的字符串要包含在双引号中}
ShowMessage(s);
end;
3.FormatFloat 格式化浮点数 原型:
function FormatFloat(const Format: string Value: Extended): string 例子:
var
s: string;
begin
//FormatFloat 的参数1是 String 格式指令, 参数2是实数类型 Extended
s := FormatFloat(''###.###'',12.3456);
//返回: 12.346
s := FormatFloat(''000.000'',12.3456);
//返回: 012.346
s := FormatFloat(''#.###'',12.3);
//返回: 12.3
s := FormatFloat(''0.000'',12.3);
//返回: 12.300
s := FormatFloat(''#,#.#'',1234567);
//返回: 1,234,567
s := FormatFloat(''0,0.0'',1234567);
//返回: 1,234,567.0
s := FormatFloat(''0.00E+0'',1234567);
//返回: 1.23E+6
s := FormatFloat(''0.00E+00'',1234567);
//返回: 1.23E+06
//在科学计数法中使用 # 好像不合适?
ShowMessage(s);
end;
参看资料:
http://www.cnblogs.com/del/archive/2007/12/18/1005161.html
http://www.cnblogs.com/del/archive/2007/12/19/1005205.html
http://www.cnblogs.com/del/archive/2007/12/19/1005212.html
http://www.cnblogs.com/sonicit/archive/2007/06/04/769882.html
我们今天的关于使用.format和格式化带有字段宽度参数的列表的分享已经告一段落,感谢您的关注,如果您想了解更多关于Date Format(日期格式化)、DecimalFormat.format()的更快替代方法?、Delphi格式化函数Format、FormatDateTime和FormatFloat、Delphi格式化函数Format、FormatDateTime和FormatFloat详解的相关信息,请在本站查询。
本文标签: