在PowerShell中,是否有一种简单的方法可以在另一个地区格式化数字等?我目前正在编写一些函数来简化SVG的生成,SVG使用.作为小数分隔符,而PowerShell在将浮点数转换为字符串时尊重我的地区设置(de-DE)。
是否有一种简单的方法可以为函数设置另一个区域设置,而不需要粘贴
.ToString((New-Object Globalization.CultureInfo ""))在每个double变量之后?
注意:这是关于用于格式化的区域设置,而不是格式字符串。
(附带的问题是:在这种情况下是否应该使用不变区域性,或者更确切地说是使用en-US?)
ETA:,我在这里尝试的是以下几点:
function New-SvgWave([int]$HalfWaves, [double]$Amplitude, [switch]$Upwards) {
"<path d='M0,0q0.5,{0} 1,0{1}v1q-0.5,{2} -1,0{3}z'/>" -f (
$(if ($Upwards) {-$Amplitude} else {$Amplitude}),
("t1,0" * ($HalfWaves - 1)),
$(if ($Upwards -xor ($HalfWaves % 2 -eq 0)) {-$Amplitude} else {$Amplitude}),
("t-1,0" * ($HalfWaves - 1))
)
}我经常写的东西有点自动化,双值需要使用小数点,而不是逗号(他们在我的语言环境中使用)。
ETA2:添加有趣的琐事:
PS Home:> $d=1.23
PS Home:> $d
1,23
PS Home:> "$d"
1.23通过将变量放入字符串中,set locale似乎并不适用。
发布于 2010-03-04 15:04:28
这是一个PowerShell函数,用于测试其他区域性中的脚本。我相信它可以用于你想要的东西:
function Using-Culture ([System.Globalization.CultureInfo]$culture =(throw "USAGE: Using-Culture -Culture culture -Script {scriptblock}"),
[ScriptBlock]$script=(throw "USAGE: Using-Culture -Culture culture -Script {scriptblock}"))
{
$OldCulture = [System.Threading.Thread]::CurrentThread.CurrentCulture
$OldUICulture = [System.Threading.Thread]::CurrentThread.CurrentUICulture
try {
[System.Threading.Thread]::CurrentThread.CurrentCulture = $culture
[System.Threading.Thread]::CurrentThread.CurrentUICulture = $culture
Invoke-Command $script
}
finally {
[System.Threading.Thread]::CurrentThread.CurrentCulture = $OldCulture
[System.Threading.Thread]::CurrentThread.CurrentUICulture = $OldUICulture
}
}
PS> $res = Using-Culture fr-FR { 1.1 }
PS> $res
1.1发布于 2010-03-04 14:40:11
我在想如何让它变得简单,于是我想出了加速器:
Add-type -typedef @"
using System;
public class InvFloat
{
double _f = 0;
private InvFloat (double f) {
_f = f;
}
private InvFloat(string f) {
_f = Double.Parse(f, System.Globalization.CultureInfo.InvariantCulture);
}
public static implicit operator InvFloat (double f) {
return new InvFloat(f);
}
public static implicit operator double(InvFloat f) {
return f._f;
}
public static explicit operator InvFloat (string f) {
return new InvFloat (f);
}
public override string ToString() {
return _f.ToString(System.Globalization.CultureInfo.InvariantCulture);
}
}
"@
$acce = [type]::gettype("System.Management.Automation.TypeAccelerators")
$acce::Add('f', [InvFloat])
$y = 1.5.ToString()
$z = ([f]1.5).ToString()我希望这会有所帮助。
发布于 2017-02-24 10:35:51
如果您已经在您的环境中加载了文化,
#>Get-Culture
LCID Name DisplayName
---- ---- -----------
1031 de-DE German (Germany)
#>Get-UICulture
LCID Name DisplayName
---- ---- -----------
1033 en-US English (United States) 解决这一问题是可能的:
PS Home:> $d=1.23
PS Home:> $d
1,23就像这样:
$d.ToString([cultureinfo]::CurrentUICulture)
1.23当然,您需要记住,如果其他用户以不同的区域设置运行脚本,结果可能不会像最初所期望的那样。
然而,这一解决办法可能是有用的。玩得开心!
https://stackoverflow.com/questions/2379514
复制相似问题