นิพจน์ทั่วไปอย่างง่ายสำหรับทศนิยมที่มีความแม่นยำ 2


271

การแสดงออกปกติสำหรับทศนิยมที่มีความแม่นยำ 2 คืออะไร?

ตัวอย่างที่ถูกต้อง :

123.12
2
56754
92929292929292.12
0.21
3.1

ตัวอย่างไม่ถูกต้อง:

12.1232
2.23332
e666.76

จุดทศนิยมอาจเป็นทางเลือกและอาจรวมถึงจำนวนเต็ม


1
ที่เกี่ยวข้อง: สำหรับทศนิยมที่มีตัวคั่นหลักพันให้ดูstackoverflow.com/questions/16148034/…
Yeo

1
คำตอบที่ดีที่สุดอยู่ที่นี่: stackoverflow.com/a/39399503/715269
Gangnus

คำตอบ:


397

โทเค็น regex ที่ถูกต้องจะแตกต่างกันตามการใช้งาน รูปแบบทั่วไปคือ:

[0-9]+(\.[0-9][0-9]?)?

กะทัดรัดยิ่งขึ้น:

\d+(\.\d{1,2})?

ทั้งคู่สันนิษฐานว่าทั้งคู่มีตัวเลขอย่างน้อยหนึ่งหลักก่อนและหนึ่งตำแหน่งหลังจุดทศนิยม

ในการกำหนดให้สตริงทั้งหมดเป็นจำนวนของฟอร์มนี้ให้ตัดการแสดงออกในแท็กเริ่มต้นและแท็กสิ้นสุดเช่น (ในรูปแบบของ Perl):

^\d+(\.\d{1,2})?$

หากต้องการจับคู่ตัวเลขที่ไม่มีตัวเลขนำหน้าก่อนจุดทศนิยม ( .12) และตัวเลขทั้งหมดที่มีระยะเวลาต่อท้าย ( 12.) โดยไม่รวมอินพุตของช่วงเวลาเดียว ( .) ให้ลองดังต่อไปนี้:

^(\d+(\.\d{0,2})?|\.?\d{1,2})$

ที่เพิ่ม

ห่อส่วนที่เป็นเศษส่วน()?เพื่อให้เป็นทางเลือก โปรดทราบว่าสิ่งนี้จะยกเว้นแบบฟอร์มต่าง ๆ เช่นการ12. รวมที่จะเป็นมากกว่า^\d+\\.?\d{0,2}$นั้น

ที่เพิ่ม

ใช้^\d{1,6}(\.\d{1,2})?$เพื่อหยุดการทำซ้ำและให้ข้อ จำกัด กับส่วนทั้งหมดของค่าทศนิยม


4
ในทางคณิตศาสตร์ฉันคิดว่าตัวเลข 2 ที่แม่นยำควรมีทศนิยมสองตัวเสมอแม้ว่าตัวเลขสุดท้ายจะเป็นศูนย์ นี่ขึ้นอยู่กับประสบการณ์ของฉันกับตัวเลขที่มีนัยสำคัญดังนั้นจึงอาจผิด แต่คุณไม่รู้จริง ๆ ว่า 1.7 คือ 1.70 หรือตัวเลขใด ๆ จาก 1.70 ถึง 1.74
paxdiablo

ขอบคุณ! เป็นสิ่งที่ฉันต้องการ :) +1
alex

6
แมตช์นี้ 0001.00: /
redben

2
เพิ่ม '-?' ใน ^ \ d + (\. \ d {1,2})? $ ===> ^ -? \ d + (\. \ d {1,2})? $ สำหรับการสนับสนุน -ve
Murali Murugesan

1
@BimalDas คุณสามารถสนับสนุนเชิงลบโดย prefixing แสดงออกด้วยในขณะที่-? -?\d+(\.\d{1,2})?ฉันไม่ได้รวมเชิงลบหรือเริ่มต้นด้วยจุดทศนิยมเนื่องจากที่ไม่ได้อยู่ในคำถามของ OP แม้ว่าพวกเขาจะถูกต้องสำหรับรูปแบบตัวเลขทั่วไปมากขึ้น กระทู้ความคิดเห็นที่นี่มีวิธีจัดการ ".21" สองสามวิธี
DocMax

276
^[0-9]+(\.[0-9]{1,2})?$

และเนื่องจากการแสดงออกปกติน่ากลัวในการอ่านเข้าใจน้อยกว่านี่คือสิ่งที่เทียบเท่า verbose:

^                         # Start of string
 [0-9]+                   # Require one or more numbers
       (                  # Begin optional group
        \.                # Point must be escaped or it is treated as "any character"
          [0-9]{1,2}      # One or two numbers
                    )?    # End group--signify that it's optional with "?"
                      $   # End of string

คุณสามารถแทนที่[0-9]ด้วย\dในการใช้งานการแสดงออกปกติส่วนใหญ่ (รวมถึงPCREที่พบมากที่สุด) ฉันทิ้งไว้อย่าง[0-9]ที่ฉันคิดว่ามันอ่านง่ายกว่า

นอกจากนี้ต่อไปนี้เป็นสคริปต์ Python แบบง่าย ๆ ที่ฉันใช้ตรวจสอบ:

import re
deci_num_checker = re.compile(r"""^[0-9]+(\.[0-9]{1,2})?$""")

valid = ["123.12", "2", "56754", "92929292929292.12", "0.21", "3.1"]
invalid = ["12.1232", "2.23332", "e666.76"]

assert len([deci_num_checker.match(x) != None for x in valid]) == len(valid)
assert [deci_num_checker.match(x) == None for x in invalid].count(False) == 0

ฉันต้องการตัวเลขสูงสุด 3 หลักก่อนทศนิยมลองแบบนี้โดยไม่มีโชค ^ ([0-9] {0,3}) + (\. [0-9] {1,2})? $
Raghurocks

3
@Raghurocks ลบ+paren หลังปิดครั้งแรกออกไป^([0-9]{0,3})(\.[0-9]{1,2})?$
dbr

สำหรับผู้ใช้ Java: ทศนิยมไม่ควรหนี

3
@Gracchus คุณแน่ใจหรือไม่ มันน่าจะเป็น\\.แทนที่จะเป็น\.เพราะ.จะดูเหมือนว่าใช้งานได้ แต่ตรงกับอักขระใด ๆ (ไม่ใช่แค่ตำแหน่งทศนิยม) ตัวอย่างเช่นทั้งสอง1z23และ1.23อาจถูกพิจารณาว่าถูกต้องหากคุณไม่รอด
dbr

@dbr บางทีนั่นคือสิ่งที่ควรจะเป็น Java บ่นเกี่ยวกับการหลบหนีที่ไม่เหมาะสม การลบ "แก้ไขแล้ว" (ปิดเครื่อง), lol ฉันยังไม่ได้มีโอกาสทดสอบอย่างเต็มที่

20

ในการรวมเครื่องหมายลบและไม่อนุญาตให้ใช้หมายเลขเช่น015(ซึ่งสามารถเข้าใจผิดว่าเป็นตัวเลขฐานแปด) ให้เขียน:

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

นี่คือการอนุญาตให้อัลฟาก่อนที่จะทศนิยมสำหรับฉัน อนุญาต X.25
BengalTigger

1
สิ่งนี้ไม่ จำกัด จำนวนตำแหน่งทศนิยมที่ 2
Dawood ibn Kareem

13

สำหรับตัวเลขที่ไม่มีตัวคั่นหลักพันฉันชอบ regex ขนาดกะทัดรัดที่เรียบง่ายนี้:

\d+(\.\d{2})?|\.\d{2}

หรือไม่จำกัดความแม่นยำที่ 2:

\d+(\.\d*)?|\.\d+

หลังการแข่งขัน
1
100
100
100.74
100.7
0.7
.7
.72

และไม่ตรงกับสตริงว่าง (เช่น \ d *.? \ d * จะ)



7
^[0-9]+(\.([0-9]{1,2})?)?$

จะทำให้สิ่งต่าง ๆ เป็นที่12.ยอมรับ นี่ไม่ใช่สิ่งที่ยอมรับกันโดยทั่วไป แต่ถ้าในกรณีที่คุณต้อง“ ยืดหยุ่น” นั่นเป็นวิธีหนึ่งที่จะไป และแน่นอน[0-9]สามารถถูกแทนที่ด้วย\dแต่ฉันคิดว่ามันอ่านได้มากกว่านี้


5

ลองสิ่งนี้

 (\\+|-)?([0-9]+(\\.[0-9]+))

มันจะช่วยให้สัญญาณบวกและลบได้เช่นกัน


3

คำตอบที่สำคัญคือผิดเพราะมันเป็น5.หรือ5,อินพุต

รหัสนี้จัดการกับมัน (แต่ในตัวอย่างจำนวนลบของฉันเป็นสิ่งต้องห้าม):

/^[0-9]+([.,][0-9]{1,2})?$/;

ผลลัพธ์เป็นเบลล์:

true => "0" / true => "0.00" / true => "0.0" / true => "0,00" / true => "0,0" / true => "1,2" true => "1.1" / true => "1" / true => "100" true => "100.00" / true => "100.0" / true => "1.11" / true => "1,11" / false => "-5" / false => "-0.00" / true => "101" / false => "0.00.0" / true => "0.000" / true => "000.25" / false => ".25" / true => "100.01" / true => "100.2" / true => "00" / false => "5. " / false => "6," / true => "82" / true => "81,3" / true => "



2

โดยทั่วไปคือตำแหน่งทศนิยมที่ไม่ จำกัด :

^-?(([1-9]\d*)|0)(.0*[1-9](0*[1-9])*)?$.


1

คุณจะไม่จำเป็นต้องใช้eในการe666.76เข้าสู่บัญชี?

กับ

(e|0-9)\d*\d.\d{1,2)

ไม่นั่นจะอยู่นอกขอบเขตของโครงการ! ขอบคุณ แต่ก็เป็นประโยชน์ :)
user39221

1

เพิ่มคำตอบของฉันด้วยบางคนอาจพบว่ามีประโยชน์หรืออาจถูกต้องเช่นกัน

function getInteger(int){
  var regx = /^[-+]?[\d.]+$/g;
  return regx.test(int);
}


alert(getInteger('-11.11'));

1

สิ่งนี้ใช้ได้กับฉัน:

(-?[0-9]+(\.[0-9]+)?)

กลุ่ม 1คือหมายเลขลอยของคุณและกลุ่ม 2เป็นเพียงเศษส่วนเท่านั้น


1

ฉันลองกับโครงการของฉัน ซึ่งช่วยให้ตัวเลขที่มี+ | -สัญญาณเช่นกัน

/^(\+|-)?[0-9]{0,}((\.){1}[0-9]{1,}){0,1}$/

0

Chrome 56 ไม่ยอมรับรูปแบบประเภทนี้ (Chrome 56 กำลังเพิ่ม 11.11. เพิ่มเติม) พร้อมหมายเลขประเภทใช้ประเภทเป็นข้อความที่กำลังดำเนินการ


0

ซึ่งจะอนุญาตให้มีทศนิยมด้วยการยกกำลังและไม่เกิน 2 หลัก

^[+-]?\d+(\.\d{2}([eE](-[1-9]([0-9]*)?|[+]?\d+))?)?$

การสาธิต


ไม่ตรงกับจำนวนเต็มหรือ1.2e-10
โตโต้

ใช่ขอบคุณสำหรับการแก้ไขของคุณ ฉันคิดว่ามันเป็นเพียงตัวเลขทศนิยม
Nambi_0915

([0-9]+)?\d*ถูกเขียนดีกว่า 10e3ตอนนี้มันไม่ตรงกับ และ OP ต้องการจับคู่ไม่เกิน 2 หลัก
โตโต้

-1
 function DecimalNumberValidation() {
        var amounttext = ;
            if (!(/^[-+]?\d*\.?\d*$/.test(document.getElementById('txtRemittanceNumber').value))){
            alert('Please enter only numbers into amount textbox.')
            }
            else
            {
            alert('Right Number');
            }
    }

ฟังก์ชั่นจะตรวจสอบความถูกต้องของตัวเลขสภาพอากาศเลขทศนิยมใด ๆ ที่มีตำแหน่งทศนิยมหรือไม่มันจะพูดว่า "หมายเลขที่ถูกต้อง" อื่น ๆ ที่ชาญฉลาด "กรุณาใส่ตัวเลขลงในช่องข้อความจำนวนเท่านั้น" ข้อความแจ้งเตือนจะเกิดขึ้น

ขอบคุณ ... :)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.