设置数值格式 1
格式化操作符 -f 可以将数值插入到字符串,每一个通配符都有统一的结构。
{index[,alignment][:format]}:
- Index:
索引编号用来识别把那个值用来替换通配符。例如你可能使用了多个通配符,或者同一个通配符使用了多次,甚至多种格式。此时,索引编号是唯一能够识别那个值将用来替换。另外两个选项Alignment和Format则作为辅助条件。
- Alignment:
正数和负数,可以指定目标值是否左对齐或者右对齐。还可以支持数值以指定的宽度显示,如果数值的实际宽度大于指定宽度,则忽略指定宽度。如果数值宽度小于指定宽度,剩余的部分会以空白填充,这一选项非常利于制表。
- Format:
数值可以被格式化成许多不同的类型,下面会预览这些你可能会用到一些格式概要。
格式化语句比较特殊,大小写敏感,这和PowerShell中其它语句的使用稍有不同。下面举个例子:
# 使用小写字母d:格式化
"Date: {0:d}"
-f
(
Get-Date
)
Date: 2013/5/31
# 使用大写字母D:格式化
"Date: {0:D}"
-f
(
Get-Date
)
Date: 2013年5月31
|
符号 | 类型 | 调用示例 | 输入结果 |
# | 数字占位符 | “{0:(#).##}” -f $value | (1000000) |
% | 百分号 | “{0:0%}” -f $value | 100000000% |
, | 千分符 | “{0:0,0}” -f $value | 1,000,000 |
,. | 一千的整数倍 | “{0:0,.} ” -f $value | 1000 |
. | 小数点 | “{0:0.0}” -f $value | 1000000.0 |
0 | 占位符 0 | “{0:00.0000}” -f $value | 1000000.0000 |
c | 货币 | “{0:c}” -f $value | ¥1,000.00 |
d | 十进制 | “{0:d}” -f $value | 1000000 |
e | 科学计数法 | “{0:e}” -f $value | 1.000000e+006 |
e | 指数通配符 | “{0:00e+0}” -f $value | 10e+5 |
f | 保留小数位 | “{0:f}” -f $value | 1000000.00 |
g | 常规 | “{0:g}” -f $value | 1000000 |
n | 千分符 | “{0:n}” -f $value | 1,000,000.00 |
x | 十六进制 | “0x{0:x4}” -f $value | 0x4240 |
使用上面表格中,你可以快速并舒服地格式化数值,例如千分符的使用可以让用户避免去纠结,1后面到底跟了几个0,是10万呢,还是100万。
另外PowerShell还提供了非常丰富的日期格式化选项,相关的格式见下表。
符号 | 类型 | 调用示例 | 输出 |
d | 短日期格式 | “{0:d}” –f $value | 2013/6/1 |
D | 长日期格式 | “{0:D}” –f $value | 2013年6月1日 |
t | 短时间格式 | “{0:t}” –f $value | “{0:t}” –f $value |
T | 长时间格式 | “{0:T}” –f $value | 23:18:50 |
f | 完整日期和时间(短) | “{0:f}” –f $value | 2013年6月1日 23:18 |
F | 完整日期和时间(长) | “{0:F}” –f $value | 2013年6月1日 23:18:50 |
g | 标准时间 (短) | “{0:g}” –f $value | 2013/6/1 23:18 |
G | 标准时间长 (长) | “{0:G}” –f $value | 2013/6/1 23:18:50 |
M | 月日格式 | “{0:M}” –f $value | 6月1日 |
r | RFC1123 日期格式 | “{0:r}” –f $value | Sat, 01 Jun 2013 23:18:50 GMT |
s | 排序日期格式 | “{0:s}” –f $value | 2013-06-01T23:18:50 |
u | 通用日期格式 | “{0:u}” –f $value | 2013-06-01 23:18:50Z |
U | 通用排序日期 GMT格式 | “{0:U}” –f $value | 2013年6月1日 15:18:50 |
Y | 年/月格式模式 | “{0:Y}” –f $value | 2013年6月 |
自定义日期格式 | |||
dd | 一个月中天 | “{0:dd}” -f $value | 01 |
ddd | 星期的缩写 | “{0:ddd}” -f $value | 周六 |
dddd | 完整星期 | “{0:dddd}” -f $value | 星期六 |
gg | 纪年法 | “{0:gg}” -f $value | 公元 |
hh | 小时0-12 | “{0:hh}” -f $value | 11 |
HH | 小时0-23 | “{0:HH}” -f $value | 23 |
mm | 分钟 | “{0:mm}” -f $value | 18 |
MM | 月份 | “{0:MM}” -f $value | 06 |
MMM | 月份缩写 | “{0:MMM}” -f $value | 六月 |
MMMM | 完整月份 | “{0:MMMM}” -f $value | 六月 |
ss | 秒 | “{0:ss}” -f $value | 55 |
tt | 上午或者下午 | “{0:tt}” -f $value | 下午 |
yy | 两位数字的年份 | “{0:yy}” -f $value | 13 |
yyyy | 四位数字的年份 | “{0:yyyy}” -f $value | 2013 |
zz | 不包含分钟的时区 | “{0:zz}” -f $value | +08 |
zzz | 包含分钟的时区 | “{0:zzz}” -f $value | +08:00 |
下面看一个例子:
$date
=
Get-Date
Foreach
(
$format
in
"d"
,
"D"
,
"f"
,
"F"
,
"g"
,
"G"
,
"m"
,
"r"
,
"s"
,
"t"
,
"T"
, `
"u"
,
"U"
,
"y"
,
"dddd, MMMM dd yyyy"
,
"M/yy"
,
"dd-MM-yy"
) {
"PowerShell 日期格式, 使用 $format : {0}"
-f
$date
.ToString(
$format
) }
|
输出:
PowerShell 日期格式,使用 d : 2013/6/6 PowerShell 日期格式,使用 D : 2013年6月6日 PowerShell 日期格式,使用 f : 2013年6月6日 0:13 PowerShell 日期格式,使用 F : 2013年6月6日 0:13:05 PowerShell 日期格式,使用 g : 2013/6/6 0:13 PowerShell 日期格式,使用 G : 2013/6/6 0:13:05 PowerShell 日期格式,使用 m : 6月6日 PowerShell 日期格式,使用 r : Thu, 06 Jun 2013 00:13:05 GMT PowerShell 日期格式,使用 s : 2013-06-06T00:13:05 PowerShell 日期格式,使用 t : 0:13 PowerShell 日期格式,使用 T : 0:13:05 PowerShell 日期格式,使用 u : 2013-06-06 00:13:05Z PowerShell 日期格式,使用 U : 2013年6月5日 16:13:05 PowerShell 日期格式,使用 y : 2013年6月 PowerShell 日期格式,使用 dddd, MMMM dd yyyy : 星期四, 六月 06 2013 PowerShell 日期格式,使用 M/yy : 6/13 PowerShell 日期格式,使用 dd-MM-yy : 06-06-13
如果你想找出那些类型支持被格式化选项,只须查找.NET中那些类型支持多余的ToString()方法.
[appdomain]
::currentdomain.getassemblies() |
ForEach-Object
{
$_
.GetExportedTypes() |
Where-Object
{!
$_
.IsSubclassof(
[System.Enum]
)}
} |
ForEach-Object
{
$Methods
=
$_
.getmethods() |
Where-Object
{
$_
.name
-eq
"tostring"
} |%{
"$_"
};
If
(
$methods
-eq
"System.String ToString(System.String)"
) {
$_
.fullname
}
}
|
输出:
System.Enum System.DateTime System.Byte System.Convert System.Decimal System.Double System.Guid System.Int16 System.Int32 System.Int64 System.IntPtr System.SByte System.Single System.UInt16 System.UInt32 System.UInt64 Microsoft.PowerShell.Commands.MatchInfo
例如,其中的数据类型 ”全球唯一标示符”:
System.Guid
因为你会经常使用到它,它是全球通用的,下面会给你一个简单的例子来创建GUID。
PS > $guid = [GUID]::NewGUID() PS > Foreach ($format in "N","D","B","P") { >> "GUID with $format : {0}" -f $GUID.ToString($format)} >> GUID with N : e1a5d98f4227470b84c2b37a6a8fb894 GUID with D : e1a5d98f-4227-470b-84c2-b37a6a8fb894 GUID with B : {e1a5d98f-4227-470b-84c2-b37a6a8fb894} GUID with P : (e1a5d98f-4227-470b-84c2-b37a6a8fb894)