《劍指Offer》-20.表示數(shù)值的字符串

題干

請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù)用來判斷字符串是否表示數(shù)值(包括整數(shù)和小數(shù)),例如,字符串 +1005e2、 -123、 3.1416、 -1E-16 都表示數(shù)值,但 12e、 1a3.141.2.3、 +-5、 12e+5.4 都不是。

解題思路

數(shù)值字符串的模式 A[.[B]][e|EC],A是數(shù)值的整數(shù)部分,有正負(fù)值區(qū)分,B是數(shù)值的小數(shù)部分,緊跟著小數(shù)點(diǎn),C為指數(shù)部分,緊跟著e或E,C也有正負(fù)值區(qū)分。

在小數(shù)里可能沒有整數(shù)部分,整數(shù)后也可能只有小數(shù)點(diǎn)而沒有小數(shù)部分。

因此可以按照字符串是否符合這個(gè)模式來判斷是否是數(shù)值。

代碼實(shí)現(xiàn)

function isNumeric($str)
{
    if (!isset($str)) {
        return false;
    }
    $idx = 0;
    $numeric = scanInteger($str, $idx);

    if ($str[$idx] == '.') {
        $idx++;

        /**
         * 小數(shù)可以沒有整數(shù)部分,如.123 等于 0.123
         * 小數(shù)點(diǎn)后面可以沒有數(shù)字,如123. 等于 123.0
         * 小數(shù)點(diǎn)前后都有數(shù)字
         */
        $numeric = scanUnsignedInteger($str, $idx) || $numeric;
    }
    if (isset($str[$idx]) && ($str[$idx] == 'e' || $str[$idx] == 'E')) {
        $idx++;
        /**
         * e|E 后面必須有數(shù)字,且必須是整數(shù)
         */
        $numeric = $numeric && scanInteger($str, $idx);
    }

    return $numeric && !isset($str[$idx]);
}

function scanInteger($str, &$idx)
{
    if ($str[$idx] == '+' || $str[$idx] == '-') {
        $idx++;
        return scanUnsignedInteger($str, $idx);
    }

    return scanUnsignedInteger($str, $idx);
}

function scanUnsignedInteger($str, &$idx)
{
    $hasNumeric = false;
    while (isset($str[$idx]) && $str[$idx] >= '0' && $str[$idx] <= '9') {
        $idx++;
        $hasNumeric = true;
    }

    return $hasNumeric;
}

var_dump(isNumeric('123.'));
var_dump(isNumeric('.123'));
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,509評(píng)論 0 13
  • 前言 最先接觸編程的知識(shí)是在大學(xué)里面,大學(xué)里面學(xué)了一些基礎(chǔ)的知識(shí),c語言,java語言,單片機(jī)的匯編語言等;大學(xué)畢...
    oceanfive閱讀 3,370評(píng)論 0 7
  • 本文首發(fā)于我的個(gè)人博客:尾尾部落 題目描述 請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù)用來判斷字符串是否表示數(shù)值(包括整數(shù)和小數(shù))。例如,字符...
    繁著閱讀 373評(píng)論 0 1
  • 前言 2. 實(shí)現(xiàn) Singleton 3. 數(shù)組中重復(fù)的數(shù)字 4. 二維數(shù)組中的查找 5. 替換空格 6. 從尾到...
    Observer_____閱讀 3,152評(píng)論 0 1
  • 昨天,孩子的學(xué)校創(chuàng)新杯競(jìng)賽成績(jī)發(fā)下來,這一次是將英語和數(shù)學(xué)總分進(jìn)行排名,年部400個(gè)同學(xué)他排第36名,對(duì)于這樣的成...
    Sunny的小木屋閱讀 1,377評(píng)論 4 1

友情鏈接更多精彩內(nèi)容