Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   скрипт для написания суммы прописью (http://forum.oszone.net/showthread.php?t=298921)

corbis 24-04-2015 18:51 2500293

скрипт для написания суммы прописью
 
Код:

Function Amount {
param ($Argument)

 $Arg1 = @("", "один ", "два ", "три ", "четыре ", "пять ", "шесть ", "семь ", "восемь ", "девять ")
 $Arg2 = @("", "десять ", "двадцать ", "тридцать ", "сорок ", "пятьдесят ", "шестьдесят ", "семьдесят ", "восемьдесят ", "девяносто ")
 $Arg3 = @("", "сто ", "двести ", "триста ", "четыреста ", "пятьсот ", "шестьсот ", "семьсот ", "восемьсот ", "девятьсот ")
 $Arg4 = @("", "одна ", "две ", "три ", "четыре ", "пять ", "шесть ", "семь ", "восемь ", "девять ")
 $Arg5 = @("десять ", "одиннадцать ", "двенадцать ", "тринадцать ", "четырнадцать ", "пятнадцать ", "шестнадцать ", "семнадцать ", "восемнадцать ", "девятнадцать ")
 
 If ($Argument -le 0) {
    "ноль"
  break
 }

 $Units = Levels -Number $Argument -Degree 1
 $Dozen = Levels -Number $Argument -Degree 2
 $Hundred = Levels -Number $Argument -Degree 3
 $Thousand = Levels -Number $Argument -Degree 4
 $Dozen_Thousand = Levels -Number $Argument -Degree 5
 $Hundred_Thousand = Levels -Number $Argument -Degree 6
 $millions = Levels -Number $Argument -Degree 7
 $Dozen_Millions = Levels -Number $Argument -Degree 8
 
 switch -Regex ($millions) {
        1 {$millions_text = $Arg1[$millions] + "миллион "}
  "[2-4]" {$millions_text = $Arg1[$millions] + "миллиона "}
  "[5-9]" {$millions_text = $Arg1[$millions] + "миллионов "}
    }

 switch -Regex ($Dozen_Millions) {
      1 {$millions_text = $Arg5[$millions] + "миллионов "; break}
  "[2-9]" {$Dozen_Millions_text = $Arg2[$Dozen_Millions]}
 }

switch -regex($Thousand){
    0 { If ($Dozen_Thousand -gt 0) { $Thousand_text = $Arg4[$Thousand] + "тысяч "}}
    1 {$Thousand_text = $Arg4[$Thousand] + "тысяча "}
  "[2-4]" {$Thousand_text = $Arg4[$Thousand] + "тысячи "}
  "[5-9]" {$Thousand_text = $Arg4[$Thousand] + "тысяч "}
 }
 
 switch -Regex ($Dozen_Thousand){
      1 {$Thousand_text = $Arg5[$Thousand] + "тысяч "; break}
"[2-9]" {$Dozen_Thousand_text = $Arg2[$Dozen_Thousand]}
}

 $Hundred_Thousand_text = $Arg3[$Hundred_Thousand]


 If (($Dozen_Thousand -eq 0) -And ($Thousand -eq 0) -And ($Hundred_Thousand -gt 0))
  {
  "тысяч"
  $Hundred_Thousand_text = $Hundred_Thousand_text + " тысяч "
  }


$Units_text = $Arg1[$Units]

switch -Regex ($Dozen){
        1 {$Units_text = $Arg5[$Units]}
  "[2-9]" {$Dozen_text = $Arg2[$Dozen]}
 }
 
 $Hundred_text = $Arg3[$Hundred]

 $Amount = $Dozen_Millions_text + $millions_text + $Hundred_Thousand_text + $Dozen_Thousand_text + $Thousand_text + $Hundred_text + $Dozen_text + $Units_text
 $Amount
}


Function Levels {
param ($Number, $Degree)
[Math]::Floor([Math]::Floor($Number - ([Math]::Pow(10,$Degree)) * ([Math]::Floor($Number / ([Math]::Pow(10,$Degree))))) / ([Math]::Pow(10,$Degree-1)))
}

Авторство не мое, переписал с Excel. Может пригодится кому.

DJ Mogarych 26-01-2024 14:43 3023226

Хороший скрипт, но небезупречный.

Код:

amount "100297"
тысяч
сто  тысяч двести девяносто семь


YuS_2 27-01-2024 15:22 3023281

Цитата:

Цитата DJ Mogarych
но небезупречный »

а... чего это, некропостим по-маленьку? :)
Код:

function levels {
        #((n-10^k*(n//10^k))//(10^(k-1))
        param ([decimal]$number, [int]$degree)
        [decimal]::truncate(($number-([math]::pow(10,$degree))*
        [decimal]::truncate($number/[math]::pow(10,$degree)))/
        [math]::pow(10,$degree-1))
}

function Amount {
        param ([bigint]$argument)
        if($argument -lt -999999999999 -or $argument -gt 999999999999){
                return $argument
        } elseif ($argument -eq 0){
                return 'ноль'
        } elseif ($argument -lt 0){$argument=[bigint]::abs($argument);$m = 'минус '}
       
        $arg1 = @('','один ','два ','три ','четыре ','пять ','шесть ','семь ','восемь ','девять ')
        $arg2 = @('','десять ','двадцать ','тридцать ','сорок ','пятьдесят ','шестьдесят ',
        'семьдесят ','восемьдесят ','девяносто ')
        $arg3 = @('','сто ','двести ','триста ','четыреста ','пятьсот ','шестьсот ','семьсот ',
        'восемьсот ','девятьсот ')
        $arg4 = @('','одна ','две ','три ','четыре ','пять ','шесть ','семь ',
        'восемь ', 'девять ')
        $arg5 = @('десять ','одиннадцать ','двенадцать ','тринадцать ','четырнадцать ',
        'пятнадцать ','шестнадцать ','семнадцать ','восемнадцать ','девятнадцать ')

        $units = levels -n $argument -d 1
        $dicker = levels -n $argument -d 2
        $hundred = levels -n $argument -d 3
        $thousand = levels -n $argument -d 4
        $dicker_thousand = levels -n $argument -d 5
        $hundred_thousand = levels -n $argument -d 6
        $millions = levels -n $argument -d 7
        $dicker_millions = levels -n $argument -d 8
        $hundred_millions = levels -n $argument -d 9
        $billions = levels -n $argument -d 10
        $dicker_billions = levels -n $argument -d 11
        $hundred_billions = levels -n $argument -d 12
       
        $units_t = $arg1[$units]
        switch -r ($dicker){
                1 {$units_t = $arg5[$units]}
                '[2-9]' {$dicker_t = $arg2[$dicker]}
        }
        $hundred_t = $arg3[$hundred]
        switch -r ($thousand){
                0 { if ($dicker_thousand -gt 0) { $thousand_t = $arg4[$thousand] + 'тысяч '}}
                1 {$thousand_t = $arg4[$thousand] + 'тысяча '}
                '[2-4]' {$thousand_t = $arg4[$thousand] + 'тысячи '}
                '[5-9]' {$thousand_t = $arg4[$thousand] + 'тысяч '}
        }
        switch -r ($dicker_thousand){
                1 {$thousand_t = $arg5[$thousand] + 'тысяч '; break}
                '[2-9]' {$dicker_thousand_t = $arg2[$dicker_thousand]}
        }
        $hundred_thousand_t = $arg3[$hundred_thousand]
        if (($dicker_thousand -eq 0) -and ($thousand -eq 0) -and ($hundred_thousand -gt 0)) {
                $hundred_thousand_t = $hundred_thousand_t + 'тысяч '
        }
        switch -r ($millions) {
                0{if($dicker_millions -gt 0){$millions_t=$arg1[$millions]+'миллионов '}}
                1 {$millions_t = $arg1[$millions] + 'миллион '}
                '[2-4]' {$millions_t = $arg1[$millions] + 'миллиона '}
                '[5-9]' {$millions_t = $arg1[$millions] + 'миллионов '}
        }
        switch -r ($dicker_millions) {
                1 {$millions_t = $arg5[$millions] + 'миллионов '; break}
                '[2-9]' {$dicker_millions_t = $arg2[$dicker_millions]}
        }
        $hundred_millions_t = $arg3[$hundred_millions]
        if (($dicker_millions -eq 0) -and ($millions -eq 0) -and ($hundred_millions -gt 0)) {
                $hundred_millions_t = $hundred_millions_t + 'миллионов '
        }
        switch -r ($billions) {
                0 {if($dicker_billions -gt 0){$billions_t=$arg1[$millions]+'миллиардов '}}
                1 {$billions_t = $arg1[$billions] + 'миллиард '}
                '[2-4]' {$billions_t = $arg1[$billions] + 'миллиарда '}
                '[5-9]' {$billions_t = $arg1[$billions] + 'миллиардов '}
        }
        switch -r ($dicker_billions) {
                1 {$billions_t = $arg5[$billions] + 'миллардов '; break}
                '[2-9]' {$dicker_billions_t = $arg2[$dicker_billions]}
        }
        $hundred_billions_t = $arg3[$hundred_billions]
        if (($dicker_billions -eq 0) -and ($billions -eq 0) -and ($hundred_billions -gt 0)) {
                $hundred_billions_t = $hundred_billions_t + 'миллиардов '
        }
        $amount = $m+$hundred_billions_t+$dicker_billions_t+$billions_t+$hundred_millions_t+
        $dicker_millions_t+$millions_t+$hundred_thousand_t+$dicker_thousand_t+$thousand_t+
        $hundred_t+$dicker_t+$units_t
        return $amount
}

amount $args[0]


DJ Mogarych 27-01-2024 16:29 3023284

Да понадобилась функция, а времени на изобретение своего велосипеда не было.
Спасибо!

YuS_2 27-01-2024 16:46 3023290

Цитата:

Цитата DJ Mogarych
понадобилась функция »

Да, это тот же скрипт, модифицированный только уже, с увеличением максимумов и с отрицательными числами... тоже как-то понадобился, поковырял... но, не помню, довел ли я его "до ума", давно было дело... лучше перепроверить.


Время: 02:37.

Время: 02:37.
© OSzone.net 2001-