【问题标题】:How can I convert a number into an array of digits?如何将数字转换为数字数组?
【发布时间】:2013-11-13 20:40:00
【问题描述】:

我正在尝试找到一种将数字转换为数字数组的方法,类似于字符数组,并且仍然能够对数组执行数学运算。

我的第一个想法是将数字转换为字符串,然后转换为字符数组,然后将数组转换回 Int32 类型。然而,这有一些意想不到的结果。例如,[int[]](1024).ToString().ToCharArray() 会产生以下数组:

49
48
50
52

我知道这里发生了什么 - PowerShell 将数字视为 ASCII 字符,并将它们转换为它们的数值。但是,这并不能帮助我解决我的问题。

将数字转换为个位数整数数组的“正确方法”是什么?

【问题讨论】:

    标签: arrays powershell


    【解决方案1】:

    试试这个:

    [char[]]'1024' | %{$_ - 48}
    

    这会将字符转换为正确值的整数:

    C:\PS> [char[]]'1024' | %{$_ - 48} | %{$_.GetType().Name}
    Int32
    Int32
    Int32
    Int32
    

    这是一个使用 int 的“数学”版本:

    C:\PS> $number = 1024
    C:\PS> $numDigits = [math]::Floor([math]::Log10($number)) + 1
    C:\PS> $res = @()
    C:\PS> for ($i = 0; $i -lt $numDigits; $i++) {$res += $number % 10; $number = [Math]::Floor($number / 10)}
    C:\PS> $res[($res.count-1)..0]
    1
    0
    2
    4
    

    【讨论】:

    • 啊,这么简单,因为 ASCII 值都比数字值高 48。不完全是“纯粹的”,但它有效!
    • 另一种选择是使用 [Math]::Log10() 确定位数,然后连续取模 10 并除以 10。
    【解决方案2】:

    好的。

    [int[]][string[]][char[]]'1024'
    ([int[]][string[]][char[]]'1024').gettype()
    1
    0
    2
    4
    
    IsPublic IsSerial Name                                     BaseType                   
    -------- -------- ----                                     --------                   
    True     True     Int32[]                                  System.Array               
    

    从 1024 开始,将其转换为 [char[]] 以分隔数字。然后将字符转换为字符串以进行 int 转换文字文本,而不是 ascii 代码。

    不同的策略,从 [int] 开始,并尽量减少类型转换:

    $n = 1024
    $array = [int[]](($n -split '') -ne '')
    
    $array
    $array.GetType()
    
    
    1
    0
    2
    4
    
    IsPublic IsSerial Name                                     BaseType                   
    -------- -------- ----                                     --------                   
    True     True     Int32[]                                  System.Array               
    

    【讨论】:

    • 如果您的号码已经是一个字符串,则此方法有效。如果它是一个整数,有没有办法做到这一点,最好 而 不必做 another 转换成字符串?
    • 发布了另一个版本
    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 2022-08-09
    • 1970-01-01
    相关资源
    最近更新 更多