Есть ли простой способ преобразовать число в слово с WordPress через шорткод? - PullRequest
0 голосов
/ 02 января 2019

Есть ли функция, которая выражает любое заданное число в словах с помощью шорткода?Я протестировал эту функцию, но мне кажется, что у меня проблема с шорткодом.

Моя функция:

function number_to_word( $num = '' ){
$num    = ( string ) ( ( int ) $num );

if( ( int ) ( $num ) && ctype_digit( $num ) )
{
    $words  = array( );

    $num    = str_replace( array( ',' , ' ' ) , '' , trim( $num ) );

    $list1  = array('','one','two','three','four','five','six','seven',
        'eight','nine','ten','eleven','twelve','thirteen','fourteen',
        'fifteen','sixteen','seventeen','eighteen','nineteen');

    $list2  = array('','ten','twenty','thirty','forty','fifty','sixty',
        'seventy','eighty','ninety','hundred');

    $list3  = array('','thousand','million','billion','trillion',
        'quadrillion','quintillion','sextillion','septillion',
        'octillion','nonillion','decillion','undecillion',
        'duodecillion','tredecillion','quattuordecillion',
        'quindecillion','sexdecillion','septendecillion',
        'octodecillion','novemdecillion','vigintillion');

    $num_length = strlen( $num );
    $levels = ( int ) ( ( $num_length + 2 ) / 3 );
    $max_length = $levels * 3;
    $num    = substr( '00'.$num , -$max_length );
    $num_levels = str_split( $num , 3 );

    foreach( $num_levels as $num_part )
    {
        $levels--;
        $hundreds   = ( int ) ( $num_part / 100 );
        $hundreds   = ( $hundreds ? ' ' . $list1[$hundreds] . ' Hundred' . ( $hundreds == 1 ? '' : 's' ) . ' ' : '' );
        $tens       = ( int ) ( $num_part % 100 );
        $singles    = '';

        if( $tens < 20 )
        {
            $tens   = ( $tens ? ' ' . $list1[$tens] . ' ' : '' );
        }
        else
        {
            $tens   = ( int ) ( $tens / 10 );
            $tens   = ' ' . $list2[$tens] . ' ';
            $singles    = ( int ) ( $num_part % 10 );
            $singles    = ' ' . $list1[$singles] . ' ';
        }
        $words[]    = $hundreds . $tens . $singles . ( ( $levels && ( int ) ( $num_part ) ) ? ' ' . $list3[$levels] . ' ' : '' );
    }

    $commas = count( $words );

    if( $commas > 1 )
    {
        $commas = $commas - 1;
    }

    $words  = implode( ', ' , $words );

    //Some Finishing Touch
    //Replacing multiples of spaces with one space
    $words  = trim( str_replace( ' ,' , ',' , trim_all( ucwords( $words ) ) ) , ', ' );
    if( $commas )
    {
        $words  = str_replace_last( ',' , ' and' , $words );
    }

    return $words;
}
else if( ! ( ( int ) $num ) )
{
    return 'Zero';
}
return '';}

add_shortcode( 'convertNumber', 'number_to_word' );

Например:

Если шорткод имеет значение [convertNumber num= '1432'], тогда эта функция вернет «тысячу четыреста тридцать два» в моей странице WordPress.

1 Ответ

0 голосов
/ 10 января 2019

Используйте класс Числовой форматер , который облегчает это.

$number_formatter = new NumberFormatter("en", NumberFormatter::SPELLOUT);
echo $number_formatter->format(1432);

Например, использовать его в WordPress

function number_to_word($atts, $content){
    include('class.numberformatter.php');
    // let's fetch all of the arguments of the shortcode
    $atts = shortcode_atts( 
        array(
            'number' => '0',
        ), $atts );
    $number = $atts['number'];
    $number_formatter = new NumberFormatter("en", NumberFormatter::SPELLOUT);
    $converted = $number_formatter->format($number);
    return $converted;
}
add_shortcode( 'convertNumber', 'number_to_word' );

Вы можете вызывать его в любом месте WordPress по [convertNumber number="2222"]

Спасибо

...