JapaneseStringUtils.psm1

<#
 .Synopsis
  全角文字を半角文字に変換します。
 
 .Description
  引数の文字列にある全角文字を半角文字に変換します。
 
 .Parameter Str
  変換対象の文字列
 
 .Example
   #全角文字を半角文字に変換
   ConvertTo-Hankaku "abc123アイう.."
   abc123アイう..
#>

function ConvertTo-Hankaku {
    param([String] $str)

    process {
      Add-Type -AssemblyName Microsoft.VisualBasic
      return [Microsoft.VisualBasic.Strings]::StrConv($str, [Microsoft.VisualBasic.VbStrConv]::Narrow)
    }
}

<#
 .Synopsis
  半角文字を全角文字に変換します。
 
 .Description
  引数の文字列にある半角文字を全角文字に変換します。
 
 .Parameter Str
  変換対象の文字列
 
 .Example
   # 半角文字を全角文字に変換
   ConvertTo-Zenkaku "abc123アイう.."
   abc123アイう..
#>

function ConvertTo-Zenkaku {
    param([String] $str)

    process {
      Add-Type -AssemblyName Microsoft.VisualBasic
      return [Microsoft.VisualBasic.Strings]::StrConv($str, [Microsoft.VisualBasic.VbStrConv]::Wide)
    }
}
Export-ModuleMember -Function ConvertTo-Zenkaku

<#
 .Synopsis
  カタカナをひらがなに変換します。
 
 .Description
  引数の文字列にあるカタカナをひらがなに変換します。
 
 .Parameter Str
  変換対象の文字列
 
 .Example
   # カタカナをひらがなに変換
   ConvertTo-Hiragana "じゃパン"
   じゃぱん
#>

function ConvertTo-Hiragana {
    param([String] $str)

    process {
      Add-Type -AssemblyName Microsoft.VisualBasic
      return [Microsoft.VisualBasic.Strings]::StrConv($str, [Microsoft.VisualBasic.VbStrConv]::Hiragana)
    }
}

<#
 .Synopsis
  ひらがなをカタカナに変換します。
 
 .Description
  引数の文字列にあるひらがなをカタカナに変換します。
 
 .Parameter Str
  変換対象の文字列
 
 .Example
   # ひらがなをカタカナに変換
   ConvertTo-Katakana "じゃパン"
   ジャパン
#>

function ConvertTo-Katakana {
    param([String] $str)

    process {
      Add-Type -AssemblyName Microsoft.VisualBasic
      return [Microsoft.VisualBasic.Strings]::StrConv($str, [Microsoft.VisualBasic.VbStrConv]::Katakana)
    }
}

<#
 .Synopsis
  漢数字を数値に変換します
 
 .Description
  引数の文字列の漢数字を数値に変換します
 
 .Parameter Str
  変換対象の文字列
 
 .Example
   # ひらがなをカタカナに変換
   ConvertFrom-Kansuuji "1億5千万および百三十一"
   150000000および131
#>

function ConvertFrom-Kansuuji {
    param([String] $str)

    process {

      $str = ConvertTo-Hankaku $str

      $kan2ara = @{
        "零" = 0;
        "〇" = 0;

        "一" = 1;
        "二" = 2;
        "三" = 3;
        "四" = 4;
        "五" = 5;
        "六" = 6;
        "七" = 7;
        "八" = 8;
        "九" = 9;

        "壱" = 1;
        "弐" = 2;
        "参" = 3;

        "1" = 1;
        "2" = 2;
        "3" = 3;
        "4" = 4;
        "5" = 5;
        "6" = 6;
        "7" = 7;
        "8" = 8;
        "9" = 9;
      }

      $tani2ara = @{
        "十" = 10;
        "百" = 100;
        "千" = 1000;
        "万" = 10000;
        "億" = [Math]::Pow(10, 8);
        "兆" = [Math]::Pow(10, 12);
        "京" = [Math]::Pow(10, 16);
        "垓" = [Math]::Pow(10, 20);
        "𥝱" = [Math]::Pow(10, 24);
        "穣" = [Math]::Pow(10, 28);
        "溝" = [Math]::Pow(10, 32);
        "澗" = [Math]::Pow(10, 36);
        "正" = [Math]::Pow(10, 40);
        "載" = [Math]::Pow(10, 44);
        "極"  = [Math]::Pow(10, 48);
        "恒河沙" = [Math]::Pow(10, 52);
        "阿僧祇" = [Math]::Pow(10, 56);
        "那由他" = [Math]::Pow(10, 60);
        "不可思議" = [Math]::Pow(10, 64);
        "無量大数" = [Math]::Pow(10, 68);

        "拾" = 10;
      }

      $converted = ""

      $strIndex = 0
      $isNum = $false # $str[$i]が漢数字中かいなかを示す変数

      # 一つ前の数を保持する変数。
      # 例えば、「二十」の場合に、十を処理している時は2(二)が格納
      $beforeNum = $null

      $num = 0
      while($strIndex -lt $str.Length) {
        $sub = $str.Substring($strIndex);

        # 一~九の数字か調べ、$beforeNumに変換後の値を格納し、次の文字を処理する
        $kan2 = $kan2ara.Keys | Where-Object { $sub.StartsWith($_) }
        if ($kan2.Count) {
          $isNum = $true

          if ($null -ne $beforeNum) {
            $converted = $converted + $beforeNum
          }

          $beforeNum = $kan2ara[$kan2 + ""]
          $strIndex = $strIndex + 1
          continue
        }

        # 十,千,万などか調べ、一つ前に数字があれば、その値と掛けた値を$numに加算
        # 例えば「二十」の場合、二(2) * 10で$numに20を加算。
        # 加算するのは、例えば「二十」の前に「百」があり「百二十」となっている場合への対応
        $matchedTani = $tani2ara.Keys | Where-Object { $sub.StartsWith($_) }
        if ($matchedTani.Count) {
          $isNum = $true

          if ($null -eq $beforeNum) {
            $baseNum = 1
          } else {
            $baseNum = $beforeNum
          }

          $tani = $tani2ara[$matchedTani + ""]
          $mod = $num % $tani
          if ($null -eq $beforeNum) {
            if ($mod -eq 0) {
              $num = $num + (1 * $tani)
            } else {
              $num = ($num - $mod) + ($mod * $tani)
            }
          } else {
            $num = ($num - $mod) + (($mod + $baseNum) * $tani)
          }

          $beforeNum = $null;
          $strIndex = $strIndex + $matchedTani.Length
          continue
        }

        if ($isNum) {
          $isNum = $false
          if ($null -ne $beforeNum) {
            $num = $num + $beforeNum
            $beforeNum = $null
          }
          $converted = $converted + $num
          $num = 0
        }

        $converted = $converted + $sub[0]
        $strIndex = $strIndex + 1
      }

      if ($isNum) {
        if ($null -ne $beforeNum) {
          $num = $num + $beforeNum
          $beforeNum = $null
        }
        $converted = $converted + $num
        $num = 0
      }

      $converted
    }
}
Export-ModuleMember -Function *