第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

明智地解析科學記數法?

明智地解析科學記數法?

胡子哥哥 2019-08-13 15:00:08
明智地解析科學記數法?我希望能夠編寫一個函數,它以科學記數法形式接收一個數字作為字符串,并將系數和指數分開作為單獨的項目。我可以使用正則表達式,但傳入的數字可能不會被標準化,我更愿意能夠規(guī)范化然后打破這些部分。一位同事已經使用VB6獲得了解決方案的一部分,但它并不完全存在,如下面的成績單所示。cliVe> a = 1e6cliVe> ? "coeff: " & o.spt(a) & " exponent: " & o.ept(a)coeff: 10 exponent: 5應該是1和6cliVe> a = 1.1e6cliVe> ? "coeff: " & o.spt(a) & " exponent: " & o.ept(a)coeff: 1.1 exponent: 6正確cliVe> a = 123345.6e-7cliVe> ? "coeff: " & o.spt(a) & " exponent: " & o.ept(a)coeff: 1.233456 exponent: -2正確cliVe> a = -123345.6e-7cliVe> ? "coeff: " & o.spt(a) & " exponent: " & o.ept(a)coeff: 1.233456 exponent: -2應該是-1.233456和-2cliVe> a = -123345.6e+7cliVe> ? "coeff: " & o.spt(a) & " exponent: " & o.ept(a)coeff: 1.233456 exponent: 12正確有任何想法嗎?順便說一句,Clive是一個基于VBScript的CLI,可以在我的博客上找到。
查看完整描述

3 回答

?
海綿寶寶撒

TA貢獻1809條經驗 獲得超8個贊


谷歌在“科學記譜法regexp”上展示了一些比賽,包括這一場比賽(不要用它!!!!)


*** warning: questionable ***

/[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?/

其中包括-.5e7和+ 00000e33等情況(您可能不希望這兩種情況)。


相反,我強烈建議您使用Doug Crockford的JSON網站上的語法,該網站明確記錄了JSON中數字的構成。這是從該頁面獲取的相應語法圖:


如果你查看他的json2.js腳本的第456行(在javascript中安全地轉換為JSON),你會看到正則表達式的這一部分:


/-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/

具有諷刺意味的是,它與他的語法圖不符....(看起來我應該提交一個bug)我相信實現該語法圖的正則表達式是這樣的:


/-?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?/

如果你想允許一個初始+,你會得到:


/[+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?/

根據自己的喜好添加捕獲括號。


我還強烈建議您充實一堆測試用例,以確保包含您想要包含(或不包括)的可能性,例如:


allowed:

+3

3.2e23

-4.70e+9

-.2E-4

-7.6603


not allowed:

+0003   (leading zeros)

37.e88  (dot before the e)

祝好運!


查看完整回答
反對 回復 2019-08-13
?
慕仙森

TA貢獻1827條經驗 獲得超8個贊

建立最高評級的答案,我稍微修改了正則表達式/^[+\-]?(?=.)(?:0|[1-9]\d*)?(?:\.\d*)?(?:\d[eE][+\-]?\d+)?$/

它提供的好處是:

  1. 允許匹配數字.9(我做了(?:0|[1-9]\d*)可選項?

  2. 防止在開始時僅匹配運算符并防止匹配的零長度字符串(使用前瞻性(?=.)

  3. 防止匹配e9因為它需要\d在科學記數法之前

我的目標是用它來捕獲重要的數字并進行重要的數學運算。因此,我也會將捕捉組切成這樣:/^[+\-]?(?=.)(0|[1-9]\d*)?(\.\d*)?(?:(\d)[eE][+\-]?\d+)?$/。

解釋如何從中獲得重要數據:

  1. 整個捕獲是您可以交付的數字 parseFloat()

  2. 匹配1-3將顯示為未定義或字符串,因此組合它們(替換為undefined'')應該給出可從中提取有效數字的原始數字。

這個正則表達式還可以防止匹配左邊填充的零,JavaScript有時會接受,但我看到它會導致問題并且不會對有效數字產生任何影響,所以我看到防止左邊填充的零作為一個好處(特別是在表單中)。但是,我確信可以修改正則表達式以吞噬左邊填充的零。

我看到這個正則表達式的另一個問題是它不匹配90.e9或其他這樣的數字。但是,我發(fā)現這種或類似的匹配極不可能,因為科學記數法中的慣例是避免這樣的數字。雖然您可以在JavaScript中輸入它,但您可以輕松輸入9.0e10并獲得相同的重要數字。

UPDATE

在我的測試中,我也發(fā)現了它可以匹配的錯誤'.'。因此,應該修改前瞻,(?=\.\d|\d)以導致最終的正則表達式:

/^[+\-]?(?=\.\d|\d)(?:0|[1-9]\d*)?(?:\.\d*)?(?:\d[eE][+\-]?\d+)?$/


查看完整回答
反對 回復 2019-08-13
?
絕地無雙

TA貢獻1946條經驗 獲得超4個贊

這是我剛剛快速入侵的一些Perl代碼。

my($sign,$coeffl,$coeffr,$exp) = $str =~ /^\s*([-+])?(\d+)(\.\d*)?e([-+]?\d+)\s*$/;my $shift = length $coeffl;$shift = 0 if $shift == 1;my $coeff =
  substr( $coeffl, 0, 1 );if( $shift || $coeffr ){
  $coeff .=
    '.'.
    substr( $coeffl, 1 );}$coeff .= substr( $coeffr, 1 ) if $coeffr;$coeff = $sign . $coeff if $sign;$exp += $shift;say "coeff: $coeff exponent: $exp";


查看完整回答
反對 回復 2019-08-13
  • 3 回答
  • 0 關注
  • 568 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號