Преобразование слов к числам в PHP

Вы можете заставить редактируемый в данный момент вид отказаться от статуса первого респондента с помощью [view endEditing:YES]. Это скрывает клавиатуру.

В отличие от -[UIResponder resignFirstResponder], -[UIView endEditing:] будет искать в подпредставлениях, чтобы найти текущего первого респондента. Таким образом, вы можете отправить его на верхний уровень представления (например, self.view в UIViewController), и он будет делать правильные вещи.

(Этот ответ ранее включал несколько других решений, которые также работали, но были более сложными, чем необходимо. Я удалил их, чтобы избежать путаницы.)

20
задан user132513 3 July 2009 в 02:55
поделиться

3 ответа

Есть много страниц обсуждение преобразования чисел в слова. Не так много для обратного направления. Лучшее, что я смог найти, это какой-то псевдокод на Ask Yahoo. См. http://answers.yahoo.com/question/index?qid=20090216103754AAONnDz хороший алгоритм:

В общем, вы делаете две вещи: Поиск токенов (слов, которые переводятся в числа) и применение грамматики. Короче говоря, вы создаете синтаксический анализатор для очень ограниченного языка.

Вам потребуются следующие токены:

POWER: тысяча, миллион, миллиард
СТО: сто
ДЕСЯТЬ: двадцать, тридцать ... девяносто
БЛОК: один, два, три, ... девять,
СПЕЦИАЛЬНЫЕ: десять, одиннадцать, двенадцать, ... девятнадцать

(отбросьте любые символы "и", поскольку они бессмысленны. Разбейте дефисы на два токена. То есть шестьдесят пять должны быть обработаны как "шестьдесят" "пять")

После того, как вы разметили свою строку, двигайтесь от ВПРАВО НАЛЕВО.

  1. Возьмите все токены ПРАВО, пока не нажмете POWER или всю строку.

  2. Разберите токены после точки остановки для следующих шаблонов:

    СПЕЦИАЛЬНЫЙ
    TEN
    БЛОК
    ДЕСЯТЬ БЛОК
    ЕДИНИЦЫ СОТ
    БЛОК СОТ СПЕЦИАЛЬНЫЙ
    СОТНИ ДЕСЯТЬ
    БЛОК СТО БЛОК
    UNIT HUNDRED TEN UNIT

    (Предполагается, что "семнадцать сотен" не разрешено в этой грамматике)

    Это дает вам последние три цифры вашего числа.

  3. Если вы остановились на всей строке, вы закончили.

  4. Если вы остановились на мощности, начните снова с шага 1, пока не достигнете более высокой мощности или всей строки.

22
ответ дан 29 November 2019 в 23:20
поделиться

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

<?php

$str = 'twelve billion people know iPhone has two hundred and thirty thousand, seven hundred and eighty-three apps as well as over one million units sold';

function strlen_sort($a, $b)
{
    if(strlen($a) > strlen($b))
    {
        return -1;
    }
    else if(strlen($a) < strlen($b))
    {
        return 1;
    }
    return 0;
}

$keys = array(
    'one' => '1', 'two' => '2', 'three' => '3', 'four' => '4', 'five' => '5', 'six' => '6', 'seven' => '7', 'eight' => '8', 'nine' => '9',
    'ten' => '10', 'eleven' => '11', 'twelve' => '12', 'thirteen' => '13', 'fourteen' => '14', 'fifteen' => '15', 'sixteen' => '16', 'seventeen' => '17', 'eighteen' => '18', 'nineteen' => '19',
    'twenty' => '20', 'thirty' => '30', 'forty' => '40', 'fifty' => '50', 'sixty' => '60', 'seventy' => '70', 'eighty' => '80', 'ninety' => '90',
    'hundred' => '100', 'thousand' => '1000', 'million' => '1000000', 'billion' => '1000000000'
);


preg_match_all('#((?:^|and|,| |-)*(\b' . implode('\b|\b', array_keys($keys)) . '\b))+#i', $str, $tokens);
//print_r($tokens); exit;
$tokens = $tokens[0];
usort($tokens, 'strlen_sort');

foreach($tokens as $token)
{
    $token = trim(strtolower($token));
    preg_match_all('#(?:(?:and|,| |-)*\b' . implode('\b|\b', array_keys($keys)) . '\b)+#', $token, $words);
    $words = $words[0];
    //print_r($words);
    $num = '0'; $total = 0;
    foreach($words as $word)
    {
        $word = trim($word);
        $val = $keys[$word];
        //echo "$val\n";
        if(bccomp($val, 100) == -1)
        {
            $num = bcadd($num, $val);
            continue;
        }
        else if(bccomp($val, 100) == 0)
        {
            $num = bcmul($num, $val);
            continue;
        }
        $num = bcmul($num, $val);
        $total = bcadd($total, $num);
        $num = '0';
    }
    $total = bcadd($total, $num);
    echo "$total:$token\n";
    $str = preg_replace("#\b$token\b#i", number_format($total), $str);
}
echo "\n$str\n";

?>
4
ответ дан 29 November 2019 в 23:20
поделиться

Пакет PEAR Numbers_Words , вероятно, будет хорошим началом: http://pear.php.net/package-info.php?package=Numbers_Words

0
ответ дан 29 November 2019 в 23:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: