2

私は現在、会社の小切手印刷ソリューションをまとめています。小切手を印刷するときは、支払った金額から数百万、数十万、数万、数千、数百、数十、および単位(ポンド/ドル/ユーロなど)を印刷する必要があります。

111232.23の場合、以下に記述したコードから次のように正しく出力されます。これを行うためのより効率的または信頼性の高い方法があると感じずにはいられませんか?これを行うライブラリ/クラスの数学のテクニックを知っている人はいますか?

float(111232.23)
Array
(
    [100000] => 1
    [10000] => 1
    [1000] => 1
    [100] => 2
    [10] => 3
    [1] => 2
)

<?php

$amounts = array(111232.23,4334.25,123.24,3.99);

function cheque_format($amount)
{
    var_dump($amount);
    #no need for millions
    $levels = array(100000,10000,1000,100,10,1);
    do{
        $current_level = current($levels);
        $modulo = $amount % $current_level;
        $results[$current_level] = $div = number_format(floor($amount) / $current_level,0);
        if($div)
        {
            $amount -= $current_level * $div;
        }
    }while($modulo && next($levels));

print_r($results);
}

foreach($amounts as $amount)
{
 cheque_format($amount);
}
?>
4

3 に答える 3

3

PHPスクリプトがこれにどうなるか正確にはわかりませんが、必要なものとして10000、1000、100、10、1がある場合、量が必要です。10,000 ドルは何ドルですか?

floor($dollar/10000)

何千?

floor(($dollar%10000)/1000) 

于 2012-07-26T18:12:01.563 に答える
3

PHP のnumber_format関数を書き直しただけだと思います。私の提案は、PHP 関数を書き直すのではなく、使用することです。

<?php

$number = 1234.56;

// english notation (default)
$english_format_number = number_format($number);
// 1,235

// French notation
$nombre_format_francais = number_format($number, 2, ',', ' ');
// 1 234,56

$number = 1234.5678;

// english notation without thousands separator
$english_format_number = number_format($number, 2, '.', '');
// 1234.57

?>
于 2012-07-26T12:17:35.957 に答える
1

これは質問に対する答えではありませんが、以下も小数を分解します。

function cheque_format($amount, $decimals = true, $decimal_seperator = '.')
{
    var_dump($amount);

    $levels = array(100000, 10000, 1000, 100, 10, 5, 1);
    $decimal_levels = array(50, 20, 10, 5, 1);

    preg_match('/(?:\\' . $decimal_seperator . '(\d+))?(?:[eE]([+-]?\d+))?$/', (string)$amount, $match);
    $d = isset($match[1]) ? $match[1] : 0;

    foreach ( $levels as $level )
    {
        $level = (float)$level;
        $results[(string)$level] = $div = (int)(floor($amount) / $level);
        if ($div) $amount -= $level * $div;
    }

    if ( $decimals ) {
        $amount = $d;
        foreach ( $decimal_levels as $level )
        {
            $level = (float)$level;
            $results[$level < 10 ? '0.0'.(string)$level : '0.'.(string)$level] = $div = (int)(floor($amount) / $level);
            if ($div) $amount -= $level * $div;
        }
    }

    print_r($results);
}
于 2015-05-23T12:36:02.397 に答える