Десятичное число с запятой или точкой после первого числа

ИЗМЕНИТЬ 2

Спасибо за вашу помощь! Объединив ответы и некоторые другие сообщения на форуме, мне удалось решить эту проблему:

$string = strip_tags($oNode['div.item-prijs']);
$array = str_split($string,1); 
$arraytotal = ( $array[0] . ',' . $array[1] . $array[2] );
echo $arraytotal;

И показывает правильную цену сейчас. "7,49" PHP-скрипт у меня автоматически конвертирует файлы .

Извините, что я не могу дать больше ответов на вопросы. Дело закрыто.

Давайте, ребята

$price = strip_tags($oNode['div.item-prijs']);
$new_price = substr(chunk_split($price, 1, ','), 0, -1); 
echo $new_price;

Это будет эхо 7,4,9, а не 7,49. Но этот код пока лучший. Кто-нибудь знает, как это исправить?

Ну, я застрял на этом некоторое время..

Я анализирую данные с веб-сайта и хочу получить цену, но на веб-сайте между ценами нет ни запятой, ни точки. поэтому он показывает как 499, 4 больше, чем 99.

Когда я делаю:

$price = $oNode['div.item-prijs'];
echo $price;

Это будет эхо 499. Я хочу добавить запятую или точку между 4 и 99.

Я пытался:

$price = $oNode['div.item-prijs'];
$new_price = substr(chunk_split($price, 1, ','), 0, -1); 
echo $new_string;

Это будет эхом:

<,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,7,<,s,u,p,>,4,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,4,<,s,u,p,>,9,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,1,<,s,u,p,>,4,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,0,<,s,u,p,>,6,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,1,<,s,u,p,>,9,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,1,<,s,u,p,>,4,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,1,<,s,u,p,>,4,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,3,<,s,u,p,>,4,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,3,<,s,u,p,>,4,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,3,<,s,u,p,>,6,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,1,<,s,u,p,>,1,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,1,<,s,u,p,>,8,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,1,<,s,u,p,>,9,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,1,<,s,u,p,>,9,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,1,<,s,u,p,>,4,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,2,<,s,u,p,>,9,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,1,<,s,u,p,>,9,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,1,<,s,u,p,>,0,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,2,<,s,u,p,>,2,5,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,1,<,s,u,p,>,9,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,0,<,s,u,p,>,9,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,1,<,s,u,p,>,5,4,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,2,<,s,u,p,>,0,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,1,<,s,u,p,>,7,8,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,1,<,s,u,p,>,7,1,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,0,<,s,u,p,>,9,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,1,<,s,u,p,>,4,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,2,<,s,u,p,>,0,8,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,1,<,s,u,p,>,4,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,3,<,s,u,p,>,4,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,6,<,s,u,p,>,1,8,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,3,<,s,u,p,>,9,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,4,<,s,u,p,>,2,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,><,d,i,v, ,c,l,a,s,s,=,",i,t,e,m,-,p,r,i,j,s,",>,<,p,>,2,<,s,u,p,>,7,9,<,/,s,u,p,>,<,/,p,>,<,/,d,i,v,>

И это:

$string = $oNode['div.item-prijs'];
    $new_string = substr(chunk_split($string, 4, ','), 0, -1); 
    echo $new_string;

Это будет эхом:

,
7,49<,/sup,>,

<,/p><,/div,>,

4,99<,/sup,>,

1,49<,/sup,>,

0,69<,/sup,>,

1,99<,/sup,>,

1,49<,/sup,>,

1,49<,/sup,>,

3,49<,/sup,>,

3,49<,/sup,>,

3,69<,/sup,>,

1,19<,/sup,>,

1,89<,/sup,>,

1,99<,/sup,>,

1,99<,/sup,>,

1,49<,/sup,>,

2,99<,/sup,>,

1,99<,/sup,>,

1,09<,/sup,>,

2,25<,/sup,>,

1,99<,/sup,>,

0,99<,/sup,>,

1,54<,/sup,>,

2,09<,/sup,>,

1,78<,/sup,>,

1,71<,/sup,>,

0,99<,/sup,>,

1,49<,/sup,>,

2,08<,/sup,>,

1,49<,/sup,>,

3,49<,/sup,>,

6,18<,/sup,>,

3,99<,/sup,>,

4,29<,/sup,>,

2,79<,/sup,>

Таким образом, он будет захватывать каждую цену на странице, а также эхо-код html. Он разбивает html-код, а не только цену.

Ниже представлен HTML-код на сайте

<div class="item-prijs">
        <p>
            <cufon class="cufon cufon-canvas" alt="4" style="width: 27px; height: 42px; ">
                <canvas width="47" height="43" style="width: 47px; height: 43px; top: -1px; left: -2px; "></canvas>
                <cufontext>4</cufontext>
            </cufon>
            <sup>
                <cufon class="cufon cufon-canvas" alt="99" style="width: 24px; height: 20px; ">
                    <canvas width="35" height="21" style="width: 35px; height: 21px; top: -1px; left: -1px; ">
                    </canvas><cufontext>99</cufontext>
                </cufon>
            </sup>
        </p>
    </div>

Что я делаю не так? Я пробовал разные способы, но безуспешно. Может ли кто-нибудь помочь мне с правильным кодом?

Спасибо


person MOTIVECODEX    schedule 24.11.2011    source источник
comment
Посмотрите: php.net/manual/en/function.money-format. .php   -  person Flukey    schedule 24.11.2011
comment
Это число также известно как центы, из которых можно получить доллары, если разделить его на 100.   -  person Esailija    schedule 24.11.2011
comment
Ну, я использую HTML-парсер phpQuery.   -  person MOTIVECODEX    schedule 24.11.2011
comment
@ F4LLCON: В таком случае проверьте мой ответ.   -  person zrvan    schedule 24.11.2011
comment
Я отредактировал свой пост (первая часть)   -  person MOTIVECODEX    schedule 24.11.2011


Ответы (5)


Попробуйте это, добавьте strip_tags, чтобы удалить все теги HTML:

$price = strip_tags($oNode['div.item-prijs']);
$new_price = substr(chunk_split($price, 1, ','), 0, -1); 
echo $new_string;
person Yoram de Langen    schedule 24.11.2011
comment
Это будет эхо: 7,4,94,9,91,4,90,6,91,9,91,4,91,4,93,4,93,4,93,6,91,1,91, 8,91,9,91,9,91,4,92,9,91,9,91,0,92,2,51,9,90,9,91,5,42,0,91,7, 81,7,10,9,91,4,92,0,81,4,93,4,96,1,83,9,94,2,92,7,9 Значит запятые не на месте первый экв. : 7,49 а не 7,4,9 - person MOTIVECODEX; 24.11.2011

Что случилось с «Простым решением»?

$major = intval($price / 100);
$minor = intval($price) % 100;

echo "The price is $major.$minor.\n";

Или даже:

echo "The price is " . ($price / 100) ".\n";

(Если вас устраивает форматирование с плавающей запятой по умолчанию.)

person Kerrek SB    schedule 24.11.2011
comment
Это будет эхом: Цена 0,7. Цена 0.0. Цена 0,4. Цена 0,1. Цена 0.0. Цена 0,1. Цена 0,1. Цена 0,1. Цена 0,3. Цена 0,3. Цена 0,3. Цена 0,1. Цена 0,1. Цена 0,1. Цена 0,1. Цена 0,1. Не правильно разбирает. Первая цена должна быть 7,49, а не 0,7. - person MOTIVECODEX; 24.11.2011
comment
Проблема на самом деле не в преобразовании 499 (я полагаю, 4,99 евро) в разумный формат, а в извлечении правильных данных из HTML-узла. - person zrvan; 24.11.2011
comment
@zrvan: ОП говорит, что echo $price; производит 499, хотя ... это немного неясно. F4LLCON: Не могли бы вы добавить простое описание того, как выглядит ваш ввод и что вы хотите получить? - person Kerrek SB; 24.11.2011
comment
@KerrekSB: $oNode['div.item-prijs'], несомненно, создает текстовое представление для __toString() (4 и 99), но фактическими данными является содержимое узла. - person zrvan; 24.11.2011
comment
@zrvan: Хорошо, ленивый хак, скажи $price = $oNode['div.item-prijs']; и используй мой код :-) - person Kerrek SB; 24.11.2011
comment
Я думаю, что сгенерированный вывод равен 4‹sup›99‹/sup›, но html-рендеринг показывает вывод как 499. Таким образом, деление не будет работать в этом состоянии. (Просто догадываюсь) - person Yusuf K.; 24.11.2011
comment
Каково тогда буквальное значение $oNode['div.item-prijs']? - person Kerrek SB; 24.11.2011
comment
Это будет эхо только 7.00 вместо 7.49, почему? $price = strip_tags($oNode['div.item-prijs']); $new_price = substr(chunk_split($price, 1, ','), 0, -1); setlocale (LC_MONETARY, 'it_IT'); $money = money_format('%.2n', $new_price) . \n; - person MOTIVECODEX; 24.11.2011
comment
@F4LLCON: Не могли бы вы опубликовать буквальное значение $oNode['div.item-prijs']? (Используйте обратные кавычки для форматирования кода.) - person Kerrek SB; 24.11.2011
comment
@KerrekSB: $oNode['div.item-prijs'] — это объект phpQuery с текстовым представлением, указанным в вопросе в части Ниже приведен HTML-код на веб-сайте, но использование echo для объекта даст метод text() результат. в данном случае 499. - person zrvan; 24.11.2011
comment
@zrvan: В этом случае синтаксический анализ XML, вероятно, является самым чистым и правильным решением: просто извлеките текстовое значение элементов div/p/cufon/cufontext и div/p/sup/cufon/cufontext. Конечно, phpQuery может выполнять синтаксический анализ? - person Kerrek SB; 24.11.2011
comment
@KerrekSB: действительно так, я дал что-то на этот счет в своем ответе. - person zrvan; 24.11.2011
comment
Ну, это исправлено, разместил EDIT 2 в моем сообщении с вопросом. - person MOTIVECODEX; 24.11.2011

Учитывая, что это phpQuery, вы можете использовать:

echo trim ($oNode['div.item-prijs']->text ());

Чтобы получить фактические данные после.

Но это, вероятно, ближе к тому, что вам нужно:

$price = array ();
foreach ($oNode['div.item-prijs cufontext'] as $n)
{
        $price[] = (int )pq ($n)->text ();
}

Он создаст массив, в данном случае — два элемента, 4 и 99.

ОБНОВЛЕНИЕ:

Чтобы напечатать цену так, как вы хотели, используйте:

echo $price[0] . '.' . $price[1];

ОБНОВЛЕНИЕ 2:

Возможно, выбор phpQuery должен выглядеть примерно так:

foreach (pq ($oNode)->find ('div.item-prijs') as $price_node)
{
    // we're iterating each <div /> class 'item-prijs'.
    $price = array ();
    foreach (pq ($price_node)->find ('cufontext') as $pn)
    {
      // iterate each <cufontext /> child node to div.item-prijs
      $price[] = (int )pq ($n)->text ();
    }

    // we could add $price to an array or something, but we'll just echo for now.
    echo $price[0] . '.' . $price[1] . "\n";
}

Это будет перебирать каждый div.item-prijs и извлекать цену в массив $price.

person zrvan    schedule 24.11.2011
comment
$price = array (); foreach ($oNode['div.item-prijs'] as $n) { $price[] = (int )pq ($n)->text (); } echo $price[0] . '.' . $price[1]; Будет эхо: 749.0.499.149.69.199.149.149.349.349.369.119.189.199.199.149.299.199.109.225.199.99.154.209.178.171.99.149.208.149.349.618.399.429.279. - person MOTIVECODEX; 24.11.2011
comment
Неустранимая ошибка: невозможно использовать объект типа DOMElement в качестве массива в /usr/home/deb39836/domains/aanbdng.info/public_html/spider/updateSpar.php в строке 38. - person MOTIVECODEX; 24.11.2011
comment
Я обновил ответ, чтобы вместо этого использовать ->find (), это должно сработать. Я заметил в вопросе, что вы считаете это дело закрытым, но не стесняйтесь попробовать. - person zrvan; 24.11.2011
comment
Спасибо, пробовал, но только получается. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . В любом случае, спасибо - person MOTIVECODEX; 24.11.2011

Если я правильно понимаю проблему, вы можете убрать теги, умножить цену на 10, а затем использовать числовой_формат. После этого вам просто нужно убрать последнюю цифру.

php -r 'echo substr(number_format((499*10)), 0, -1);' => 4,99
php -r 'echo substr(number_format((599*10)), 0, -1);' => 5,99
php -r 'echo substr(number_format((5099*10)), 0, -1);' => 50,99
person mpratt    schedule 24.11.2011

Возможно, это решит вашу проблему;

$price = $oNode['div.item-prijs'];
$new_price = substr(chunk_split($price, 1, ','), 0, -1); 
echo $new_price; // not $new_string; I think $new_string is an other var in your code

но вы также анализируете свой тег <sup> в своем коде.

Не могли бы вы попробовать;

$preg='#<div class="item-prijs"><p>(.*?)<sup>(.*?)</sup></p></div>#si'; 
preg_match_all($preg,$new_string,$number,PREG_SET_ORDER); 

$numbers[0] — массив чисел до запятой

$numbers[1] — массив чисел после запятой

МОЖЕТ, это поможет;

$string = $oNode['div.item-prijs']; 
$new_string = substr(chunk_split($string, 4, ','), 0, -1);
echo str_replace("<,/sup,>,", "", $new_string);
person Yusuf K.    schedule 24.11.2011
comment
Используйте строковую переменную как $new_string, которая содержит прочитанный HTML-код. - person Yusuf K.; 24.11.2011
comment
Если ваша переменная $price действительно дает вам 499 как число, используйте метод Керрека С.Б. - person Yusuf K.; 24.11.2011
comment
Это не работает $price = $oNode['div.item-prijs']; echo "The price is " . ($price / 100) . "\n"; будет повторять: Цена 0,01 Цена 0,01 Цена 0,01 Цена 0,01 Цена 0,01 Цена 0,01 Цена 0,01 Цена 0,01 Цена 0,01 Цена 0,01 Цена 0.01 Цена 0.01 Цена 0.01 Цена 0.01 Цена 0.01 - person MOTIVECODEX; 24.11.2011
comment
Пробовал, выдает эхо: 7,49‹,/sup,›, без кавычек. strip_tags($oNode['div.item-prijs']); удалит теги, но эхо 749 без кавычек - person MOTIVECODEX; 24.11.2011
comment
Пожалуйста, попробуйте последнюю часть моего ответа, вы должны проанализировать и дисквалифицировать ненужные символы - person Yusuf K.; 24.11.2011
comment
Пожалуйста, сообщите нам значение $oNode['div.item-prijs'] - person Yusuf K.; 24.11.2011