2015-11-09 17 views
4

我需要用基于文化格式的文本文件中的数字做一些数学工作,所以我可以得到1,234.56或者我可以得到1.234,56甚至1 234,56我认为。我原本以为,以获得当前的文化与将字符串转换为基于任意文化设置的数字

$culture = (Get-Culture).Name 

然后,所有数字转换为en-US格式,做我的数学,并转换回原来的格式。然而,像这样简单的事情是行不通的。

$useCulture = New-Object System.Globalization.CultureInfo("en-US") 

$value1 = "1,234.56" 
$value2 = "1234,56" 

[double]$value1 = $value1.ToString("f", $useCulture) 
[double]$value2 = $value2.ToString("f", $useCulture) 

$value1 
$value2 

我期望得到的两个值回1234.56,但第二个是回来为123456,所以很明显我不理解怎么样的ToString工作。我的猜测是,它假定它以en-US格式存在,因为这是我的机器配置的,然后它试图转换为相同的东西,并且在$ value2上它假定千位分隔符在错误的地方?在任何情况下,我会如何从任意格式转换为指定格式,以便我可以肯定总和是正确的,然后转换回原始的任意格式? 或者,我完全错过了一些东西,还有更好的方法来解决这个问题吗? 另外,如果可能的话,我希望能够使用PS 2.0来做到这一点,因为我不能依赖于要升级到更新版本的目标机器。

+1

有趣的问题。你的意思是你需要解析的数字来自多种文化,但是你事先并不知道某个数字来源于哪种文化?如果是这样,有一个明确的可能性模糊('1.234'可能是一个数字少于2或超过1000),除非你有其他规则(例如,该数字将始终格式化2小数位或类似的东西) 。 – briantist

+0

就是这样。我有一个脚本,用Autodesk Revit启动“日志”文件,然后运行一些命令并将时间输出到文本文件。日志文件使用VBScript,输出基于用户的文化设置。我希望我的脚本可以将该文本文件读入数组,然后根据需要重复,然后执行一些数学操作,如排序,抛出较低和较高的异常值,然后平均余下的值,然后以基于文化的格式将结果输出回控制台。我不想手动解决所有可能性,因为我不知道如何使用该工具。 – Gordon

+0

是否有可能改变VBScript,以便将数字写入一种特定的文化('en-US'或其他任何,只要它是一致的),这样你知道如何读回它?如果您不想打扰原始数字,您甚至可以将它写入新文件或位置。 – briantist

回答

0

所以,如果总的结果是,你要只有数字,最多一个小数点的东西,我会尝试以下方法:

  • 更换任何非十进制以点
  • 地带的所有但最后的点,这是我们采取的是一个小数点

下面是几个测试案例工作的样本函数,但我绝对不是在我的测试无遗:

function ConvertTo-Number { 
    param(
    [Parameter(
     Mandatory=$true)] 
     [System.String] 
     $String 
) 

    if($String -notmatch '\D'){ 
    return [int]$String 
    } else { 
    $ConvertedValue = ($String -replace '\D','.') -match '^(?<int>.*?)(?<dec>[\d]*)$' 

    $ConvertedValue = $matches["int"] -replace '\D','' 

    if($matches["dec"]){ 
     $ConvertedValue+=".$($matches["dec"])" 
    } 

    return [double]$ConvertedValue 
    } 
} 

您可能希望首先清理输入字符串/如果可能的话,例如删除空格,在任何其他之前。