Klavyeden girilen girdinin sayı olmasını istiyorum (ondalıklı sayı dahil) bunu nasıl kontrol ederim

Arkadaşlar bir program yazmaya çalışıyorum ve klavyeden girdi bölümüne başka bir şey girilmesini istemiyorum sadece sayı girilebilsin ama bu girdi ondalıklı sayı da olabilir tam sayıda bu kontrolü nasıl sağlarım

klavye den sayı girmenin kodunu yaz üstüne ekleme yaparız. bu dediğinden bi şey anlaşılmıyor. hangi dil olduğu belli değil, hangi kütüphaneleri kullanıyosun belli değil. klavyeden sayı nereye giriyo ? niye giriyo ? kime giriyo ?

haklısın açıklama eksik olmuş. Python kullanıyorum bir hesaptan başka bir hesaba aktarılan para miktarını girilmesi gereken bir yerde kullanıcı klavyeden 150a veya i750 veya ylmk gibi değerler giremesin sadece mantıklı yani sayı olabilecek değerler gire bilsin istiyorum bunu isdigit(), isallnum(), isnumeric() gibi metodlarla kontrol edemiyorum çünkü bunlar 12.5 gibi bir ondalıklı sayıya doğru tepki vermiyor. Kullanıcı giremesin yanlış bir ifade oldu ben bu gidiyi nasıl kontrol ederim olacaktı soru

Terminale mi giriliyor yoksa arayüzdeki bir yere mi

isnumeric() ile kontrol edebiliyorsan kendi yazdığın bir fonksiyona göre de kontrol edebilirsin sanırım.
şöyle bir şey.

def is_convertible_to_number(number):
    try:
        float(number)
        return True
    except: 
        return False

Neden sorununuzu düzgün anlatamıyorsunuz?

Ve hatta neden düzgün anlatamadığınızı dahi farkedemiyorsunuz?

Açıklama hala eksik.

Güzel bir soru sormuş.

Yapmak istediğiniz şey terminal içinse çözümler ayrı.

Tkinter, QT ve diğer gui uygulamaları ve widgetleri için ayrı.

Şimdi hangisini yazalım? Yada hepsini yazalım içinden beğendiğiizi mi seçeceksiniz?

Girme metodunuzda nasıl bir mekanizma istiyorsunuz?

Yani sayıyı girerken mi girdikten sonra mı kontrol etsin?

Mesela 1,2,3 gibi yazabilsin ama a, b,c yazdığında yazmaya devam etmesin mi?

Bilgisayarınız decimal ayıracı olarak virgül mü kullanıyor, nokta mı?

Gireceğiniz para biriminde, desimal ayıracı ve kuruş ayıracı var mı?

Çok mu zor soru sormak?

Örnek soru:

TKinter/QT/ konsol ile, para birimi girişi yapıyorum. Para giriş verisini, label/text box/input ile konsoldan vs. ile alıyorum. Parabirimi olarak girdiğim sayılar 1.000.000, 1 gibi ondalık ayıracı nokta, kuruş ayıracı virgül. Para birimi değeri TL gibi ifadeler içermeyecek bir sayı olarak.

Girilirken, yani her bir sayıyı yazarken kontrol etmesini / giriş yapıldıktan sonra kontrol edilmesini, ve harf girişine izin vermemesini istiyorum.

Giriş ile ilgili kod parçasını aşağıda bırakıyorum:

Örnek Python kodu parçası.

Bla, bla , bla.

Bu konuda bana ne önerebilirsiniz?

Bu kadar işte. Bu kadar.

Aksi halde, soru sorana, yardım etmek isteyen herkes bunları sormak zorunda kalıyor.

Şöyle mi demek istediniz, böyle mi demek istediniz, doğru anladıysam diye başlayan cevaplar almanızın sebebi.

Kendinizi doğru ifade edip soruyu soramamış olmanızdan. Kızmayın, içinizde ne fırtınalar kopuyor, ne yaşadınız, ne aşamalardan geçtiniz biz bilemeyiz. Biz soruya bakarız anlamaya çalışırız.

Sormaya çalıştığınız sorunun cevabı çok kolay. Ama sorunuz o kadar çok ihtimal içeriyor ki, her bir ihtimale göre kod örneği buraya koyamayız. Bize de yazık değil mi?

num_input = input("bir sayı giriniz (ondalıklı sayıları nokta (.) ile ayırınız): ")
try:
    num = float(num_input)
except:
    raise Exception("Lütfen bir sayı giriniz. ondalıklı sayıları nokta (.) ile ayırınız.")
print(num)

ilk satırda kullanıcıdan bir sayı girmesini istedim. ikinci satırda bir try statement yazdım ve bu try içerisine num_input değişkenini float’a dönüştürüp num değişkenine tanımla dedim. eğer bir string yazarsam ya da ondalıklı sayıyı nokta yerine virgül ile ayırırsam (1,5 gibi) Lütfen bir sayı giriniz. ondalıklı sayıları nokta (.) ile ayırınız. hatası verecek. eğer sayı ya da noktayla ayrılmış bir ondalıklı sayı girersem bu sayı num değişkenine atanacak ve bunu yazdıracak. kolay gelsin.

1 Beğeni

siz ve birkaç arkadaş bu arkadaş gibi yeni başlayan arkadaşlara sürekli bu şekilde agresif yorumlar yapıp heveslerini kırıyorsunuz. soruyu soran kişinin sorusundan kişinin başlangıç seviyesinde olduğu gayet açık bir şekilde belli oluyor. buradan rahatça terminal app olduğu sonucu çıkarılabilir. ha siz kardeşim ben kafamı yormak istemiyorum soru açık olsun diyorsanız açıkça sorulmamış sorulara yanıt vermeyebilirsiniz.
Burayı da stackoverflow toksikliğiyle doldurmayın. toksikliğinizi stackoverflowda postları eksileyerek atın lütfen.

2 Beğeni

Bu kadar lafla hevesi kırılacaksa zaten hiç zorlamasın yapamaz. Soracak, önce soru sormayı öğrenecek ki kolayca cevaplarını alabilsin.

Başlangıç seviyesinde soru soramayan ne zaman soru sorabilecek seviyeye gelir sizce?

Herşeyi öğrendikten sonra mı sormaya başlasın?

Bence yeni öğrenen biri ilk olarak sorularını açık ve net sorabilmeyi öğrenmeli. Bu şekilde bilgiye daha kolay ulaşır.

Bu sizin varsayımınız. Henüz bu konuda net bir bilgi yok. Siz terminale göre cevaplayın. Biz diğer ihtimalleri de göz önünde tutalım sakıncası yok ise.

Kafamı yormak istemiyorum demedim.

Cevap ihtimallerinin hepsini buraya yazamayız dedim. Bu sizin ön yargınız kısaca.

Stackoverflow “toxic” i sizin düşünceniz. Burada ana fikir, soru sormadan önce benzer sorunları yaşayanlar olmuş mu onlar ne gibi yöntemler denemiş görülmesini sağlamaktır.

Böylece, balık tutmayı öğrenir, soruyu sormak yerine daha önce bu problemle karşılaşılmış mı nasıl çözülmüş araştırılmasının da faydalı olacağını vurgulamaktır.

Postlarımın toxicliği meselesinin sizin bakış açınız olduğunu düşünüyorum. Çok üzerinde durmayı da düşünmüyorum.

Özetle konuya dönersek.

Soru sorarken daha açıklayıcı olmakta fayda var ihtimaller dünyası geniş burada sayısız başlıkta örnekleyebileceğim üzere soramadıkları için cevapsız kalan yada yanlış anlaşıldığı için sayısız mesajla uzayan başlıklar var. İnsan okuyacak başlıkları, keşke düzgün soru sorulsa, düzgün cevaplar anında verilebilse ben de stackoverflow yerine buradaki mesajlara referans verebilsem.

En azından soru sorma ve cevap verme konusunda bir kültür oluşmuş olurdu.

Gereksiz tepkiniz, yeni başlayanların hevesi kırılmasın yaklaşımınız yanlış. Programlama zorlu bir iştir, biri gelip bir şey dedi diye hevesi kaçaksa yapamazsın zaten. Şimdi asıl mesele şu;

Siz sadece bir kod bırakınca yardımcı olmuş olduğunuzu düşünüyorsunuz ama faydası olmıyor. Araştırma yolları ve alternatif kaynakları kullanma yolunda fayda sağlamıyorsunuz.

Bunun yerine balık veriyorsunuz. Ama o balık da soruyu soranın istediği balık mı onu da göremiyoruz.

Bir para değeri girişi için local kütüphaneler, currency kütüphaneleri ve bir çok örnek var aklımda, görsel bir arayüz kullanıyorsa bu durumda, masking metodları da var aklımda.

Yani üfürükten float çevirimi önermeyi düşünmüyordum.

Ortada soru yokken siz cevap yazınca gerçekten faydalı olduğunuzu düşünmeye devam edin ben de bildiğim gibi devam edeyim olur mu?

Programlama zordur, herkes yapamaz. Buna ben de katılıyorum fakat insanlar bir hevesle (belki de sadece biraz daha iyi şartlar altında çalışmak için) bu işe adım atıyor. Evet pek çok insan soru sormayı bilmiyor. Evet söylediğiniz pek çok şey doğru fakat kullandığınız dil çok agresif. Hevesle soru soran birine bu şekilde yaklaşılmamalı. Bence de soru sormadan önce bir araştırma yapılmalı fakat yeni başlayan biri özellikle İngilizcesi de yoksa Google’a nasıl soru soracağını bile bilemeyebilir.
İkinci olarak başlangıç aşamasındaki bir insana tabii ki üfürükten bir float çevirme kodu yazacağım. özetle değindiğiniz konuların çoğu doğru fakat iğneleyici yazıyorsunuz. biraz daha sakin yorumlar yazmanızı öneriyorum sadece.

2 Beğeni

Katılıyorsanız, bunca soruna göğüs geren biri herhalde burada da üsluba takılmaz.

Buna katıldığınıza sevindim. Ben de basit bir giriş kodundan çok soru sorabilmeyi öğrenmelerini önemsiyorum. Vurgum da bu yönde.

Evet dilim agresif. Burada bir şey öğrenmek isteyen biri gül istiyorsa dikenine katlanacak. Burada çok kez belirttim. Bebek pış pışlayamayız ( soruyu soranı tenzih ederim.) Eğer en ufak eleştiride sert gelip bozulacak diye üslup konusuna takılacaksa öğrenmek değil egosunun peşindedir. Bu da benim sorunum değil.

Çok yumuşak üslup da denedim. Örnekleri var forumda link veririm istersen. Sadece sorusuna kodu ekledim. Bana balık verme bana anlat nasıl öğreneceğim diye soran da gördü bu gözler.

Hadi onun da linkini ekleyim:

Mesele üslup değil ,mesele buranın bir forum olduğunu , sorduğunuzda cevabınıza odaklanmanız gerektiği, kişisel konuların kimseye fayda sağlamayacağını anlamanız. Para verip kursa gitmek ve burada sorup öğrenmek kadar basit bir konu.

İpe un sereceksen tabi ki. Ama açarsın bir google translate sorunu da sorar cevabını da çevirirsin. Ufak tefek çeviri problemleri de olsa ana fikri değiştirip öğrenmeyi zorlayacak kadar kötü çevirdiğini görmedim.

Evet iğneledim. Çünkü, stackoverflow linklerimi toxic buldunuz, ve kaldırmamı emrettiniz. E yani iğnelediysek cuvaldız batırdığınızı da gözden kaçırmayın.

Sakin yorum yazan var yeterince. Sakin sakin yazsınlar. Biz de bildiğimiz gibi yazalım olmaz mı?

Madem üfürükten dedik.

Madem sizin iddianız üzerine terminalde yazıyor.

Hadi bu varsayımla kod yazalım.

Bir varsayımda da ben bulunayım. Windows üzerinde yazıyorsa çalışır bu kod ancak.

import msvcrt
import sys

def is_valid_input(char):
    return (ord(char) >= 48 and ord(char) <= 57) or char == "."

def get_user_input():
    user_input = ""
    while True:
        char = msvcrt.getch().decode('utf-8')
        if char == "\r" or char == "\n":
            break
        if not is_valid_input(char):
            continue
        sys.stdout.write(char)
        sys.stdout.flush()
        user_input += char
    return user_input


user_input = get_user_input()
print("\nGirilen sayı:", user_input)

kuruş ayıracı olarak nokta (.) varsaydım.

Bir flag kullanarak daha önce bir nokta girip girmediğini kontrol etmeyeceğini, kullanıcının bir kez nokta gireceğini varsaydım.

Windows kullandığını varsaydım.

Şimdi kullanıcıdan giriş alıyor.

Alabildiği sadece, sayılar ve nokta.

Virgül isterse nokta yerine virgül de koyabilir.

Ama çıkıp da şimdi adam olmaz ya, ben kivdy de yapıyorum bu bana yaramaz derse. Çok şey söylerim de neyse.

Yani biz biri yardım istediğinde sayfalarca da yazarız ama, aradan geçen zaman rağmen soru sorarken aynı şeyleri yaşıyorsak bırak da bildiğimiz gibi devam edelim.

Yani yüz tanıma ile uğraşan birinin bir input için soru sorarken nasıl sorarsa daha kolay cevap alcağını söylediğim örneklediğim mesaja neden bu kadar takıldın anlamadım.

Olayı stackoweflowa nasıl bağladın onu da anlamadım.

Bak iş kod vermek olsaydı. Koyardım kodu. Rakam ve nokta dışında hiç bir değer giremeyeceği, windows a özgü bir kod yazar bırakır. Bir beğeni alır giderdim.

Benim derdimin ne olduğunu umarım anlatabilmişimdir.

Yeni nesil nedense eleştirilmeye çok gelemiyor. Herkes sizi pışpışlayamaz, zor zamanların programcısı olun, zor koşullara alışın bence.

Arkadaşlar durumu şöyle izah edeyim PyQt5 ve Qt designer kullanıyorum. Orada oluşturduğum bir form var ve oraya para miktarının girilmesini istiyorum. Line Edit içine girilecek bu bilgi, bunu input mask ile 99999999 gibi formatlarsam noktaya izin vermiyor. Ben rakam ve nokta girilebilsin, ama harf girilemesin istiyorum. Bunu mask etmenin bir yolu varmı merak ettim. İkinci olarak eğer girdiyi böyle bir formata sokamıyorsak girildikten sonra bunun bir float veya integer olup olmadığını kontrol etmek istiyorum. Değilse bir hata mesajı verip girdiyi yeniden yapmasını sağlayacağım. Bunun için benim bilmediğim bir metod veya bilmediğim bir fonksiyon olabilir diye sordum. Ama ilk sorarken bu kadara genel sormamın nedeni input için de kullanabileceğim bir yol varsa onu deneyeyim amacıylaydı. Soruyu bu kadar genel sorunca genel bir çözümü olacağını düşündüğüm için öyle sordum. Soru sorma tarzını hunharca eleştiren arkadaşı esefle kınıyorum. İnsan biraz yapıcı olur. Bu kadar sivri dilli olmaya gerek yok. İçinden gelmiyorsa beğenmediğin soruları cevaplama ama kırcılığa gerek yok. Yardım edeceksen de daha ılımlı ve yapıcı olmak gerekir diye düşünüyorum.

Benim dediğimin neresi yanlış ? hangi dili kullandığı, hangi kütüphaneleri kullandığı belli değil diye soru sordum? Ayrıca programlamaya yeni başladığını nerden çıkardınız ? yoksa türkçe öğrenmeye yeni başladığın mı söylüyorsunuz ?

Bak bakalım terminal app miymiş.

1 Beğeni

Gel de şimdi ağzına hakim ol.

Olacağım işte.

İbretlik tablo.

İşte bu yüzden bu örneği verdim. İşte bu yüzden bu şekilde cevap yazdım.

Şimdi ne deyim size ben?

Soruyu sorana gelince.

Sevgili kardeşim, neden ne sorduğunu nasıl sorman gerektiğini anlattım yukarıda. Yıkıcı bulman tamamen senin alınganlığın.

Bak buyur ağzına yapışmış qt kullanmıyorum dememişsin. Boşa terminal kodu örneği verdik. Ha şimdi kırıcı konuşuyorum, çünkü daha önce kırılman için değil soruyu anlamak için insanlara vakit harcamaman için öneride bulunmuştum.

Ama şimdi eğer sen qt5 kullandığını söylemez isen, lineEdit kullandığını söylemez isen , kendince çıkarımda bulunup mask ile yapamadığını yeni söylersen.

Ben mask mı önereyim. Validator mu nasıl ayırabileceğim.

Tabi ki yardım etmeyeceğim.

Ilımlı arkadaşlar etsin.

from PyQt5.QtWidgets import QMainWindow, QWidget, QApplication, QVBoxLayout, QLineEdit
from PyQt5.QtCore import QRegularExpression
from PyQt5.QtGui import QRegularExpressionValidator, QValidator
from sys import exit, argv


class Val(QValidator):
    def validate(self, input_str, pos):
        try:
            float(input_str)
            return QValidator.Acceptable, input_str, pos
        except ValueError:
            return QValidator.Invalid, input_str, pos


class MyWin(QMainWindow):
    def __init__(self):
        super().__init__()
        sayi_validator = QRegularExpressionValidator(QRegularExpression("[0-9.]+"))
        sayi_validator2 = Val()
        sayi_validator3 = QRegularExpressionValidator(QRegularExpression("^[0-9]*\\.?[0-9]*$"))
        line_edit = QLineEdit()
        line_edit.setValidator(sayi_validator)

        line_edit2 = QLineEdit()
        line_edit2.setValidator(sayi_validator2)

        line_edit3 = QLineEdit()
        line_edit3.setValidator(sayi_validator3)

        self.line_edit4 = QLineEdit()
        self.line_edit4.textChanged.connect(self.degisti)

        lay = QVBoxLayout()

        lay.addWidget(line_edit)
        lay.addWidget(line_edit2)
        lay.addWidget(line_edit3)
        lay.addWidget(self.line_edit4)

        w = QWidget()
        w.setLayout(lay)
        self.setCentralWidget(w)

    def degisti(self, text):
        if text.count(".") == 2:
            self.line_edit4.setText(text[:-1])
        try:
            float(text)
        except ValueError:
            self.line_edit4.setText(text[:-1])


if __name__ == "__main__":
    app = QApplication(argv)
    win = MyWin()
    win.show()
    exit(app.exec_())

4 tane yöntem istediğiniz kullanın (ilki birden fazla . kabul eder diğerleri 1 tane).

1 Beğeni

Mask ile yapılır mı ? Yapılırsa nasıl yapılır bir örnek yazar mısınız ?

Bu şartlarda yapılmaz. Çünkü çok can sıkıcı bir konu oldu.

Soru sormayı beceremeyen birinin sorularını cevaplamaya çalışırken, küfreder gibi qt olduğunu öğrenene kadar cevap veren olduğunu öğrenene kadar cevap veremeyip. QT ile olduğunu ağzıdan kerpetenle aldıktan sonra çok da üzerinde çözüm üretmeyi düşünmüyorum.

Tabi sizin için google aramalarında line edit için çıkmamıştır mask ile sonuç.

Ama konu öyle bir hal aldı ki, lineEdit kullanması gerekmediğine dahi girebilecek iken vazgeçtim.

Gevşek çok marifet bak ben de yapabiliyorum der gibi bir cevap yazmak benim ilgi alanım değil.

İlgi alanı bu olanlar devam etsin.

Konuyla ilgili son sözümü bir önceki mesajda yazdım.

Kodunuz için elinize sağlık.

EDIT:

Neyse yine hayra yorayım.

from PyQt5.QtWidgets import QApplication,QLineEdit,QWidget,QFormLayout
from PyQt5.QtGui import QIntValidator,QDoubleValidator,QFont
from PyQt5.QtCore import Qt
import sys

class lineEditDemo(QWidget):
        def __init__(self,parent=None):
                super().__init__(parent)

                e = QLineEdit()
                e.setInputMask("Tl 999.9999,99")
 
                flo = QFormLayout()
                flo.addRow("Input Mask",e)

                self.setLayout(flo)
                self.setWindowTitle("QLineEdit Mask Currency Example")

        # Edit : Gereksiz test kodlarını ayıkladım.
if __name__ == "__main__":
        app = QApplication(sys.argv)
        win = lineEditDemo()
        win.show()
        sys.exit(app.exec_())

Hemde ondalık ayıraçları ile hemde binler basamaklarını koyarak, hemde önün eardına TL gibi rakamlar ekleyerek yapabilirsiniz.

Forumun amacını tekrar hatırlatmak istiyorum. Bütün dünyada emsali görülmemiş bir konunun mümessili olabilirler. Cebren ve hile ile aziz Yazbelin bütün konuları zaptedilmiş olabilir. Üyeler, fakr-ü zaruret içinde harap ve bitap düşmüş olabilir. Ey Yazbel üyeleri, bu ahval ve şerait içinde dahi vazifen, sadece konu açan kişiye değil, aynı sorunu yaşayan başka insanlarında bu foruma girdiklerinde çözüme ulaşmasını sağlamaktır.

2 Beğeni

Konuya ilgi gösteren cevap veren ve vermeyen tüm arkadaşlara teşekkür ediyorum. Gelen cevaplardan çok faydalı örnekler gördük, farklı yöntemler ve farklı bakış açıları gördük. Tüm arkadaşların emeğine sağlık tekrar teşekkür ediyorum.