จะตรวจสอบได้อย่างไรว่าสตริงว่างเปล่า?


1417

Python มีลักษณะเหมือนตัวแปรสตริงว่างเปล่าหรือไม่ซึ่งคุณสามารถทำได้:

if myString == string.empty:

วิธีที่ดีที่สุดในการตรวจสอบค่าสตริงที่ว่างเปล่าคืออะไร ฉันพบการเข้ารหัสยาก""ทุกครั้งที่ตรวจสอบสตริงว่างเปล่าไม่ดี


2
เป็นวิธีการที่""ไม่ดี?
NoName

คำตอบ:


2114

สตริงว่างคือ"เท็จ"ซึ่งหมายความว่าพวกเขาถือว่าเป็นเท็จในบริบทบูลีนดังนั้นคุณสามารถทำได้ดังนี้

if not myString:

นี่เป็นวิธีที่ต้องการหากคุณรู้ว่าตัวแปรของคุณเป็นสตริง หากตัวแปรของคุณยังอาจเป็นบางประเภทอื่น ๆ myString == ""แล้วคุณควรใช้ ดูเอกสารประกอบเกี่ยวกับการทดสอบค่าความจริงสำหรับค่าอื่น ๆ ที่เป็นเท็จในบริบทบูลีน


183
ระวังเนื่องจากมีหลายสิ่งที่เป็นเท็จเช่นกัน
Ignacio Vazquez-Abrams

9
ฉันไม่เคยได้ยินคำเท็จมาก่อน มันหมายความว่ามันกลับเท็จหรือไม่?
Joan Venge

41
@Joan: มันประเมินว่าเป็นเท็จในบริบทบูลีน
Ignacio Vazquez-Abrams

54
OP ต้องการทราบว่าตัวแปรเป็นสตริงที่ว่างเปล่า แต่คุณยังจะได้เข้าไปอยู่if not myString:บล็อกถ้าmyStringมีNone, 0, Falseฯลฯ ดังนั้นหากคุณไม่แน่ใจว่าสิ่งที่ประเภทmyStringคือคุณควรจะใช้if myString == "":ในการตรวจสอบว่าเป็นสตริงที่ว่างเปล่าเมื่อเทียบกับ ค่าเท็จอื่น ๆ
Andrew Clark

15
@AndrewClark สำหรับกรณีดังกล่าวแทนที่จะใช้สายโซ่ของif myString == ...การแสดงออกเราสามารถใช้if myString in (None, '')หรือต่อ @Bartek,if myString in (None, '') or not myString.strip()
Stew

413

จากPEP 8ในส่วน"การแนะนำการเขียนโปรแกรม" :

สำหรับซีเควนซ์ (สตริง, รายการ, สิ่งอันดับ) ให้ใช้ความจริงที่ว่าลำดับที่ว่างเปล่าเป็นเท็จ

ดังนั้นคุณควรใช้:

if not some_string:

หรือ:

if some_string:

เพียงชี้แจงลำดับมีการประเมินผลการFalseหรือTrueในบริบทแบบบูลหากพวกเขาเป็นที่ว่างเปล่าหรือไม่ พวกเขาจะไม่เท่ากันไปหรือFalseTrue


24
เยี่ยมมากที่คุณรวมการอ้างอิงถึง PEP!
เฟลิกซ์

3
PS: ในการป้องกัน PEP ที่หนึ่งได้ยืนยันว่าการพูดว่า " x เป็นเท็จ " (ตัวพิมพ์เล็กเท็จ ) x == Falseแล้วหมายความว่ามากกว่าความหมาย แต่ IMHO การชี้แจงยังคงได้รับการต้อนรับจากกลุ่มเป้าหมาย
MestreLion

233

วิธีที่สง่างามที่สุดอาจเป็นเพียงการตรวจสอบว่าจริงหรือเท็จเช่น:

if not my_string:

อย่างไรก็ตามคุณอาจต้องการตัดพื้นที่สีขาวเนื่องจาก:

 >>> bool("")
 False
 >>> bool("   ")
 True
 >>> bool("   ".strip())
 False

คุณควรจะชัดเจนมากขึ้นในเรื่องนี้อย่างไรก็ตามถ้าคุณไม่แน่ใจว่าสายนี้ได้ผ่านการตรวจสอบบางชนิดและเป็นสตริงที่สามารถทดสอบด้วยวิธีนี้


87

ฉันจะทดสอบความไม่ลงรอยกันก่อนลอก นอกจากนี้ฉันจะใช้ความจริงที่ว่าสตริงว่างเปล่าเป็นเท็จ (หรือเท็จ) วิธีนี้คล้ายกับStringUtils.isBlank ของ ApacheหรือStrings.isNullOrEmpty ของ Guava

นี่คือสิ่งที่ฉันจะใช้เพื่อทดสอบว่าสตริงเป็น None หรือ Empty หรือ Blank:

def isBlank (myString):
    if myString and myString.strip():
        #myString is not None AND myString is not empty or blank
        return False
    #myString is None OR myString is empty or blank
    return True

และตรงข้ามกับการทดสอบว่าสตริงไม่ใช่ None หรือเปล่า NOR เปล่า:

def isNotBlank (myString):
    if myString and myString.strip():
        #myString is not None AND myString is not empty or blank
        return True
    #myString is None OR myString is empty or blank
    return False

รูปแบบที่กระชับมากขึ้นของรหัสข้างต้น:

def isBlank (myString):
    return not (myString and myString.strip())

def isNotBlank (myString):
    return bool(myString and myString.strip())

ทำไมไม่if mystring and not mystring.strip()?
Migol

1
แตกต่างจากstring and not string.isspace()อย่างไร
Andrea Corbellini

7
รัดกุมมากขึ้นสำหรับผู้ที่สนใจเกี่ยวกับสิ่งดังกล่าวและdef isBlank(s): return not (s and s.strip()) def isNotBlank(s): return s and s.strip()
Carl

48

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

def is_not_blank(s):
    return bool(s and s.strip())

ทดสอบ:

print is_not_blank("")    # False
print is_not_blank("   ") # False
print is_not_blank("ok")  # True
print is_not_blank(None)  # False

ทำไมต้องไม่ใช่return bool(s.strip())
anilbey

1
AttributeError: 'NoneType' object has no attribute 'strip'
ห้องนิรภัย

28

วิธีเดียวที่มั่นคงในการทำเช่นนี้คือ:

if "".__eq__(myString):

วิธีแก้ปัญหาอื่น ๆ ทั้งหมดมีปัญหาและกรณีขอบที่เป็นไปได้ที่การตรวจสอบอาจล้มเหลว

len(myString)==0สามารถล้มเหลวได้หากmyStringเป็นวัตถุของคลาสที่สืบทอดจากstrและแทนที่__len__()เมธอด

ในทำนองเดียวกันmyString == ""และmyString.__eq__("")สามารถล้มเหลวถ้าmyStringแทนที่และ__eq__()__ne__()

ด้วยเหตุผลบางอย่าง"" == myStringยังได้รับหลงเชื่อหากมีการแทนที่myString__eq__()

myString is ""และ"" is myStringเทียบเท่า พวกเขาทั้งสองจะล้มเหลวหากmyStringไม่จริงสตริง แต่ subclass ของสตริง (ทั้งสองจะกลับมาFalse) นอกจากนี้เนื่องจากเป็นการตรวจสอบข้อมูลเฉพาะตัวเหตุผลเดียวที่ทำงานได้เพราะ Python ใช้ String Pooling (หรือที่เรียกว่า String Internment) ซึ่งใช้อินสแตนซ์เดียวกันของสตริงหากมีการฝึกงาน (ดูที่นี่: ทำไมเปรียบเทียบสตริงโดยใช้ '= = 'หรือ' คือ 'บางครั้งให้ผลลัพธ์ที่แตกต่าง? ) และ""ถูกฝึกงานตั้งแต่เริ่มต้นใน CPython

ปัญหาใหญ่กับการตรวจสอบตัวตนคือ String Internment นั้น (เท่าที่ฉันจะหาได้) ว่ามันไม่ได้มาตรฐานที่สตริงจะฝึกงาน นั่นหมายความว่าในทางทฤษฎี""ไม่จำเป็นต้องมีการฝึกงานภายใน

วิธีเดียวในการทำสิ่งนี้ที่ไม่อาจหลงกลได้จริงๆคือวิธีที่กล่าวถึงในตอนแรก: "".__eq__(myString). เนื่องจากสิ่งนี้เรียก__eq__()เมธอดของสตริงว่างอย่างชัดเจนจึงไม่สามารถถูกหลอกได้โดยการแทนที่เมธอดใด ๆ ใน myString และทำงานร่วมกับคลาสย่อยของstrและแน่นหนาทำงานร่วมกับคลาสย่อย

การพึ่งพาความผิดพลาดของสตริงอาจใช้งานไม่ได้หากวัตถุแทนที่มัน __bool__()วิธีการ

นี่ไม่ใช่งานทางทฤษฎีเท่านั้น แต่อาจเกี่ยวข้องกับการใช้งานจริงเนื่องจากฉันได้เห็นกรอบงานและไลบรารีการทำคลาสย่อยstrก่อนและใช้งานmyString is ""อาจส่งคืนเอาต์พุตที่ไม่ถูกต้องที่นั่น

นอกจากนี้การเปรียบเทียบสตริงโดยใช้ isทั่วไปเป็นกับดักที่ชั่วร้ายเพราะมันจะทำงานได้อย่างถูกต้องในบางครั้ง แต่ไม่ใช่ในเวลาอื่น ๆ เนื่องจากการรวมสตริงเป็นไปตามกฎที่ค่อนข้างแปลก

ที่กล่าวไว้ในกรณีส่วนใหญ่โซลูชันที่กล่าวถึงทั้งหมดจะทำงานอย่างถูกต้อง โพสต์นี้เป็นงานวิชาการส่วนใหญ่


2
@simpleuser คุณแน่นอน ในโลกแห่งความเป็นจริงมันก็โอเคที่จะใช้ความไม่แน่นอนของสตริงหรือเปรียบเทียบกับสตริงที่ว่างเปล่า คำตอบนี้ตรงนี้เกินความจำเป็นแล้ว
Dakkaron

จริงๆใช้eq_ ?
slboat

ทำงานได้ดีมากขอบคุณ!
eugene.polschikov

14

ทดสอบสตริงว่างหรือว่างเปล่า (วิธีที่สั้นกว่า):

if myString.strip():
    print("it's not an empty or blank string")
else:
    print("it's an empty or blank string")

7
ถ้าmyString = Noneมันจะยกข้อยกเว้น ใช้คำตอบ
Dominik

9

หากคุณต้องการแยกความแตกต่างระหว่างสตริงว่างและว่างฉันจะแนะนำให้ใช้if len(string)มิฉะนั้นฉันขอแนะนำให้ใช้อย่างif stringที่คนอื่นพูด stripข้อแม้เกี่ยวกับสายเต็มรูปแบบของช่องว่างยังคงใช้แม้ว่าดังนั้นอย่าลืมที่จะ


ฉันไม่รู้ว่าทำไมคุณไม่ต้องการใช้ "" ยกเว้นว่ามันจะส่งผลกระทบต่อประสิทธิภาพการทำงานอย่างใดอย่างหนึ่ง แต่ฉันชอบคำตอบของคุณกับ zillions of upvotes เพราะมันสับสนน้อยกว่า อย่างไรก็ตามฉันต้องการชี้ให้เห็นว่ารายการว่างเปล่าก็เป็นเท็จด้วย
Brōtsyorfuzthrāx


6
a = ''
b = '   '
a.isspace() -> False
b.isspace() -> True

1
ไม่เข้าใจจริงๆว่าโซลูชันนี้ได้ผลอย่างไร คำถามเกี่ยวกับการทดสอบว่าสตริงว่างเปล่าหรือไม่ หากคุณตั้งค่าa='a'คุณจะได้รับa.isspace() -> Falseแต่aจะไม่อยู่ในบัญชีนั้นเป็นสตริงว่าง
Adrian Keister

6

ฉันพบ hardcoding (sic) "" ทุกครั้งที่ตรวจสอบสตริงว่างเปล่าว่าไม่ดี

วิธีการทำความสะอาดรหัส

การทำเช่นนี้foo == ""เป็นการฝึกที่แย่มาก ""เป็นค่าวิเศษ คุณไม่ควรตรวจสอบค่าเวทย์มนตร์ (เรียกอีกอย่างว่าหมายเลขวิเศษ )

สิ่งที่คุณควรทำคือการเปรียบเทียบกับชื่อตัวแปรอธิบาย

ชื่อตัวแปรอธิบาย

อาจคิดว่า "empty_string" เป็นชื่อตัวแปรอธิบาย มันไม่ใช่มันไม่ได้เป็น

ก่อนที่จะไปทำ empty_string = ""และคิดว่าคุณมีชื่อตัวแปรที่ยอดเยี่ยมในการเปรียบเทียบ นี่ไม่ใช่ความหมาย "ชื่อตัวแปรอธิบาย"

ชื่อตัวแปรอธิบายที่ดีขึ้นอยู่กับบริบท คุณต้องคิดว่าสตริงว่างคืออะไรอะไร

  • มันมาจากไหน.
  • ทำไมถึงมี
  • ทำไมคุณต้องตรวจสอบมัน

ตัวอย่างฟิลด์แบบฟอร์มอย่างง่าย

คุณกำลังสร้างฟอร์มที่ผู้ใช้สามารถป้อนค่า คุณต้องการตรวจสอบว่าผู้ใช้เขียนอะไรบางอย่างหรือไม่

ชื่อตัวแปรที่ดีอาจเป็น not_filled_in

ทำให้โค้ดอ่านง่ายมาก

if formfields.name == not_filled_in:
    raise ValueError("We need your name")

ตัวอย่างการแยกวิเคราะห์ CSV อย่างละเอียด

คุณกำลังวิเคราะห์ไฟล์ CSV และต้องการแยกสตริงว่างเป็น None

(เนื่องจาก CSV ใช้ข้อความทั้งหมดจึงไม่สามารถแสดงได้ Noneโดยไม่ใช้คำหลักที่กำหนดไว้ล่วงหน้าได้)

ชื่อตัวแปรที่ดีอาจเป็น CSV_NONE

สิ่งนี้ทำให้โค้ดสามารถเปลี่ยนแปลงและปรับเปลี่ยนได้ง่ายหากคุณมีไฟล์ CSV ใหม่ที่แทนNoneด้วยสตริงอื่นที่ไม่ใช่""

if csvfield == CSV_NONE:
    csvfield = None

ไม่มีคำถามเกี่ยวกับว่ารหัสนี้ถูกต้องหรือไม่ มันค่อนข้างชัดเจนว่ามันทำในสิ่งที่ควรทำ

เปรียบเทียบสิ่งนี้กับ

if csvfield == EMPTY_STRING:
    csvfield = None

คำถามแรกที่นี่คือทำไมสตริงที่ว่างเปล่าควรได้รับการดูแลเป็นพิเศษ

สิ่งนี้จะบอกผู้เขียนโค้ดในอนาคตว่าควรพิจารณาสตริงว่างเปล่าว่าเป็น Noneในอนาคตที่เป็นสตริงว่างควรได้รับการพิจารณาเป็น

นี่เป็นเพราะมันผสมตรรกะทางธุรกิจ (ค่า CSV ควรเป็นอะไร None ) กับการติดตั้งโค้ด (เราเปรียบเทียบอะไรกันจริงๆ)

จะต้องมีการแยกความกังวลระหว่างทั้งสอง


1
มีใครต้องการไปที่ปัญหามากเพื่อหลีกเลี่ยง ""? ในบริบทของการเปรียบเทียบสตริงว่างเปล่ามีความหมายว่าอย่างไร

ขณะที่ฉันเขียนคำตอบของฉัน CSV ไม่สามารถแทนค่า null ได้โดยไม่ต้องใช้สตริง หากคุณไม่มีบริบทขอแสดงความยินดี! รหัสส่วนใหญ่ไม่ใช่
fAllnx

2
คุณพูดว่า "not_filled_in" มีความหมายมากกว่า "empty_string" หรือไม่? ฉันว่าคุณสูง
Tuncay Göncüoğlu

@ TuncayGöncüoğlu "สตริงว่าง" ไม่ได้อธิบายว่าคำสั่ง if ทดสอบเพื่ออะไร
fAllnx

5
ฉันไม่เห็นด้วยกับคำตอบนั้น ตัวเลขเวทย์มนตร์นั้นแย่ ค่าเวทย์มนตร์ทั่วไปเช่นกัน แต่""ไม่ใช่ค่ามายากล, เช่นเดียวกับTrue, FalseหรือNoneไม่ได้ค่ามายากล
Dakkaron

5

แล้วเรื่องนี้ล่ะ บางทีมันอาจจะไม่ใช่ "สง่าที่สุด" แต่ดูเหมือนว่าจะสมบูรณ์และชัดเจน:

if (s is None) or (str(s).strip()==""): // STRING s IS "EMPTY"...

สำหรับวัตถุประสงค์ส่วนใหญ่สตริงที่มีช่องว่างจะไม่ "ว่างเปล่า"
Chris Johnson

ฉันถือว่าคุณไม่มีความหมายอะไรนอกจากพื้นที่สีขาว คุณหมายถึงการใช้แถบ () ของฉัน? สำหรับจุดประสงค์ส่วนใหญ่ที่ว่างเปล่า! เป็นเรื่องน่าขันที่จะรวมสิ่งต่าง ๆ เช่น s.trim () isEmpty ()
BuvinJ

เฮ้ @Chris Johnson คุณเห็นไหมว่าคำตอบที่นี่ส่วนใหญ่ใช้แถบ () เช่นกัน? คุณไม่ลงคะแนนให้พวกเราทุกคนหรือแค่ฉัน?
BuvinJ

4

ตอบกลับไปที่ @ 1290 ขออภัยไม่มีวิธีจัดรูปแบบบล็อกในความคิดเห็น Noneค่าไม่ได้เป็นสตริงที่ว่างเปล่าในหลามและไม่เป็น (ช่องว่าง) คำตอบจาก Andrew Clark เป็นคำตอบที่ถูกต้อง: if not myString. คำตอบจาก @rouble เป็นแอปพลิเคชันเฉพาะและไม่ตอบคำถามของ OP คุณจะประสบปัญหาหากคุณใช้คำจำกัดความเฉพาะของสตริง "ช่องว่าง" โดยเฉพาะอย่างยิ่งพฤติกรรมมาตรฐานคือสิ่งที่str(None)สร้างขึ้น'None'สตริงที่ไม่ว่างเปล่า

อย่างไรก็ตามหากคุณต้องปฏิบัติต่อNoneและ (เว้นวรรค) เป็นสตริง "ว่าง" นี่เป็นวิธีที่ดีกว่า:

class weirdstr(str):
    def __new__(cls, content):
        return str.__new__(cls, content if content is not None else '')
    def __nonzero__(self):
        return bool(self.strip())

ตัวอย่าง:

>>> normal = weirdstr('word')
>>> print normal, bool(normal)
word True

>>> spaces = weirdstr('   ')
>>> print spaces, bool(spaces)
    False

>>> blank = weirdstr('')
>>> print blank, bool(blank)
 False

>>> none = weirdstr(None)
>>> print none, bool(none)
 False

>>> if not spaces:
...     print 'This is a so-called blank string'
... 
This is a so-called blank string

ตรงตามข้อกำหนด @rouble ในขณะที่ไม่ทำลายboolพฤติกรรมที่คาดหวังของสตริง


python -c "if (str(None) == 'None'): print ('OMG, WHY ??')"
Yordan Georgiev

3

ฉันพบว่ามันสง่างามเพราะมันทำให้แน่ใจว่ามันเป็นสตริงและตรวจสอบความยาวของมัน:

def empty(mystring):
    assert isinstance(mystring, str)
    if len(mystring) == 0:
        return True
    else:
        return False

คำเตือนการอ้างถึงนั้นมีไว้เพื่อเป็นเครื่องมือในการดีบั๊กและรับการปรับให้เหมาะกับกรณีที่คุณ-Oตั้งค่าสถานะหรือตั้งค่าPYTHONOPTIMIZEตัวแปร env
SilentVoid

2

อีกวิธีง่าย ๆ คือการกำหนดฟังก์ชั่นง่าย ๆ :

def isStringEmpty(inputString):
    if len(inputString) == 0:
        return True
    else:
        return False

3
คำตอบจากกระวานจะสมบูรณ์มากขึ้นถ้าเราต้องการตรวจสอบว่าการป้อนข้อมูลเป็นสตริงหรือไม่
5327

1
not str(myString)

นิพจน์นี้เป็น True สำหรับสตริงที่ว่างเปล่า สตริงที่ไม่ว่างเปล่าวัตถุที่ไม่ใช่และไม่ใช่สตริงจะสร้างเท็จทั้งหมดโดยมีข้อแม้ที่วัตถุอาจแทนที่ __str__ เพื่อขัดขวางตรรกะนี้โดยส่งคืนค่าเท็จ


0

คุณอาจดูที่การกำหนดค่าหรือสตริงว่างใน Python

นี่คือการเปรียบเทียบสตริงที่ว่างเปล่า ดังนั้นแทนที่จะทดสอบความว่างเปล่าด้วยnotคุณอาจทดสอบว่าสตริงของคุณเท่ากับสตริงว่างกับ""สตริงว่าง ...



0

เมื่อคุณอ่านไฟล์ตามบรรทัดและต้องการพิจารณาว่าบรรทัดใดว่างให้ตรวจสอบว่าคุณจะใช้.strip()เนื่องจากมีอักขระบรรทัดใหม่ในบรรทัด "empty":

lines = open("my_file.log", "r").readlines()

for line in lines:
    if not line.strip():
        continue

    # your code for non-empty lines


0

หากคุณเพิ่งใช้

not var1 

ไม่สามารถแยกความแตกต่างของตัวแปรซึ่งเป็นบูลีนFalseจากสตริงว่าง'':

var1 = ''
not var1
> True

var1 = False
not var1
> True

อย่างไรก็ตามหากคุณเพิ่มเงื่อนไขอย่างง่ายให้กับสคริปต์ของคุณความแตกต่างจะเกิดขึ้น:

var1  = False
not var1 and var1 != ''
> True

var1 = ''
not var1 and var1 != ''
> False

0

ในกรณีที่มีประโยชน์กับใครบางคนนี่คือฟังก์ชั่นอย่างรวดเร็วที่ฉันสร้างขึ้นเพื่อแทนที่สตริงว่างด้วย N / A ในรายการของรายการ (หลาม 2)

y = [["1","2",""],["1","4",""]]

def replace_blank_strings_in_lists_of_lists(list_of_lists):
    new_list = []
    for one_list in list_of_lists:
        new_one_list = []
        for element in one_list:
            if element:
                new_one_list.append(element)
            else:
                new_one_list.append("N/A")
        new_list.append(new_one_list)
    return new_list


x= replace_blank_strings_in_lists_of_lists(y)
print x

สิ่งนี้มีประโยชน์สำหรับการโพสต์รายการของรายการไปยังฐานข้อมูล mysql ที่ไม่ยอมรับช่องว่างสำหรับบางฟิลด์ (ฟิลด์ที่ทำเครื่องหมายเป็น NN ในสคีมาในกรณีของฉันนี่เป็นเพราะคีย์หลักคอมโพสิต)


-1

ฉันทำการทดลองกับสตริงเช่น '', '', '\ n' เป็นต้นฉันต้องการ isNotWhitespace ให้เป็น True ถ้าตัวแปร foo เป็นสตริงที่มีอักขระที่ไม่ใช่ช่องว่างอย่างน้อยหนึ่งตัว ฉันใช้ Python 3.6 นี่คือสิ่งที่ฉันลงเอยด้วย:

isWhitespace = str is type(foo) and not foo.strip()
isNotWhitespace = str is type(foo) and not not foo.strip()

ล้อมสิ่งนี้ไว้ในนิยามเมธอดหากต้องการ


-3

ในฐานะที่เป็น prmatta โพสต์ข้างต้น แต่มีข้อผิดพลาด

def isNoneOrEmptyOrBlankString (myString):
    if myString:
        if not myString.strip():
            return True
        else:
            return False
    return False

เพิ่งผ่านการทดสอบ: ผลตอบแทนที่แท้จริงของเขารหัสสำหรับ""และ" "และเท็จ"a"(เช่นเดียวกับที่คาดว่า) โค้ดของคุณจะส่งกลับค่าเดิมยกเว้นสตริงที่ว่างเปล่าจะส่งคืนค่า True สิ่งที่ไม่ควร
AbcAeffchen

sry เหนื่อยเกินไป: รหัสของคุณคืนค่า False สำหรับสตริงว่าง
AbcAeffchen

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