如果类型后缀为
u
,并且值可由 类型
[uint]
表示,则其类型为
[uint]
。
如果类型后缀为
u
,并且值可由 类型
[ulong]
表示,则其类型为
[ulong]
。
如果其值可以由指定的类型表示,则为其类型。
否则,该文本的格式不正确。
实际文本只能用十进制表示法编写。 此表示法可以包括小数点后面的小数值和使用指数部分的科学记数法。
指数部分包括一个“e”,后跟一个可选符号 (+/-) 和一个表示指数的数字。 例如,文本值
1e2
等于数值 100。
真实文本可以具有类型后缀和乘数后缀。
Suffix
有两种类型的实数文本:double 和 decimal。 它们分别由十进制类型后缀的缺失或存在来指示。 PowerShell 不支持值的文本表示形式
[float]
。 双实文本的类型
[double]
为 。 十进制实文本的类型
[decimal]
为 。
十进制实数文本的小数部分中的尾随零很重要。
如果实际文本中
[double]
指数部分的数字值小于支持的最小值,则实际
[double]
文本的值为 0。 如果实际文本中
[decimal]
指数部分的数字值小于支持的最小值,则表示该文本格式不正确。 如果 或
[decimal]
实际文本中
[double]
指数部分的数字值大于支持的最大值,则表示该文本格式不正确。
语法允许双实文本具有长类型后缀。
PowerShell 将此情况视为一个整数文本,其值由类型
[long]
表示。 保留此功能是为了向后兼容早期版本的 PowerShell。 但是,不建议程序员使用这种形式的整数文本,因为它们很容易掩盖文本的实际值。 例如,
1.2L
具有值 1、
1.2345e1L
值 12 和
1.2345e-5L
值 0,这些值都不是显而易见的。
为方便起见,整数和实文本可以包含一个数值乘数,该乘数指示一组常用的 2 幂之一。 数字乘数可以采用大写或小写字母的任意组合编写。
乘数后缀可以与任何类型后缀结合使用,但必须在类型后缀后面显示。 例如,文本
100gbL
格式不正确,但文本
100Lgb
有效。
如果乘数创建的值超出了后缀指定的数值类型的可能值,则文本格式不正确。 例如,文本
1usgb
格式不正确,因为该值
1gb
大于后缀指定的
us
类型所允许
[ushort]
的值。
PS> 1kb
PS> 1.30Dmb
1363148.80
PS> 0x10Gb
17179869184
PS> 1.4e23tb
1.5393162788864E+35
PS> 0x12Lpb
20266198323167232
数字类型快捷键
PowerShell 支持以下类型加速器:
使用二进制或十六进制数
如果且仅n
当指定了后缀时,过大的二进制或十六进制文本才能返回 ,[bigint]
而不是失败分析。 但是,仍遵循偶数 [decimal]
范围以上的符号位:
如果二进制字符串是 8 位长度的倍数,则最高位被视为符号位。
如果长度为 8 的倍数的十六进制字符串的第一个数字为 8 或更高,则数字被视为负数。
在二进制文本和十六进制文本上指定无符号后缀会忽略符号位。 例如, 0xFFFFFFFF
返回 -1
,但 0xFFFFFFFFu
返回 [uint]::MaxValue
4294967295 的 。
在 PowerShell 7.1 中,对十六进制文本使用类型后缀现在会返回该类型的有符号值。 例如,在 PowerShell 7.0 中,表达式 0xFFFFs
返回错误,因为正值对于类型 [int16]
来说太大。
PowerShell 7.1 将此解释为 -1
类型 [int16]
。
将文本作为 0
前缀将绕过此前缀,并被视为无符号。
例如:0b011111111
。 使用范围中的 [bigint]
文本时,这是必需的,因为 u
和 n
后缀不能组合在一起。
还可以使用 -
前缀来否定二进制文本和十六进制文本。 这可能会导致一个正数,因为允许使用符号位。
BigInteger 后缀数字接受符号位:
BigInteger 后缀十六进制将长度为 8 个字符的任意文本的高位视为符号位。 长度不包括 0x
前缀或任何后缀。
BigInteger 后缀二进制文件接受 96 个字符和 128 个字符的符号位,之后每 8 个字符接受一次。
数字类型转换
将字符串转换为数字时,支持其他十六进制格式指示器。 这些附加格式不会被识别为文本。
[int] '0xF' -eq 0xF
[int] '&hF' -eq 0xF
[int] '#F' -eq 0xF
[int] '0b1111' -eq 0b1111
[int] '0b1111' -eq 15
类似于数字文本的命令
任何看起来像有效数字文本的命令都必须使用调用运算符 (&
) 执行,否则将解释为数字。 格式不正确的文本和有效的语法 (如 1usgb
)将导致以下错误:
PS> 1usgb
At line:1 char:6
+ 1usgb
+ ~
The numeric constant 1usgb is not valid.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : BadNumericConstant
但是,具有无效语法(如 ) 1gbus
的格式不正确的文本将被解释为标准裸字符串,并且可以在调用命令的上下文中解释为有效的命令名称。
访问数值对象的属性和方法
若要访问数值文本的成员,在某些情况下需要将文本括在括号中。
文本没有小数点
文本在小数点后没有任何数字
文本没有后缀
例如,以下示例失败:
PS> 2.GetType().Name
At line:1 char:11
+ 2.GetType().Name
+ ~
An expression was expected after '('.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : ExpectedExpression
以下示例起作用:
PS> 2uL.GetType().Name
UInt64
PS> 1.234.GetType().Name
Double
PS> (2).GetType().Name
Int32
前两个示例无需将文本值括在括号中,因为 PowerShell 分析程序可以确定数值文本结束和 GetType 方法开始的位置。
PowerShell 如何分析数字文本
PowerShell v7.0 更改了数值文本分析方式,以启用新功能。
分析实数值文本
如果文本包含小数点或电子表示法,则文本字符串将分析为实数。
如果存在十进制后缀,则直接进入 [decimal]
。
否则,将 分析为 [Double]
并将乘数应用于值。 然后检查类型后缀并尝试强制转换为适当的类型。
如果字符串没有类型后缀,则分析为 [Double]
。
分析整数数字文本
使用以下步骤分析整数类型文本:
确定基数格式PS> [bigint]111111111111111111111111111111111111111111111111111111
111111111111111100905595216014112456735339620444667904
若要避免此问题,必须以字符串的形式编写值,然后转换它们:
PS> [bigint]'111111111111111111111111111111111111111111111111111111'
111111111111111111111111111111111111111111111111111111
在 PowerShell 7.0 中, N
必须使用 后缀。
PS> 111111111111111111111111111111111111111111111111111111n
111111111111111111111111111111111111111111111111111111
此外,应使用小数后缀D
来表示 和 [decimal]::MaxValue
之间的[ulong]::MaxValue
值,以保持准确性。 如果没有后缀,这些值将分析为 [Double]
使用实际分析模式。