Доброго времени суток.
помогите ввести деньги :)
переползаю с foxpro - там было просто - шаблон типа “999'999'999'999.99”
line_edit.setInputMask("999,999,999,999.99")
line_edit.setValidator(QtGui.QDoubleValidator(0, 999999999999.99, 2, line_edit))
poltergeistпробовал
line_edit.setInputMask(“999,999,999,999.99”)
# -*- coding: utf-8 -*-
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import PyQt4.Qt
import sys
def tran(num, pic):
if len(pic)==0: return num
out=""
outdec=""
#уберем не цифры
newnum=""
for i in num:
if str(i) in "-0123456789.": newnum+=i
num=newnum
if "." in num:#делим число
dec=num.split(".")[1]
num=num.split(".")[0]
else: dec=""
if "." in pic:#делим шаблон
picdec="."+pic.split(".")[1]
pic=pic.split(".")[0]
else: picdec=""
#делим целые
j=len(num)-1
for i in range(len(pic)-1,-1 ,-1):
if j>=0:
if pic[i]=="9":
out=num[j]+out
j-=1;
else:
out=pic[i]+out
#делим десятые
j=0
for i in range(0, len(picdec)):
if picdec[i]=="9":
if j<len(dec):
outdec+=dec[j]
j+=1;
else:
outdec+="0";
else:
outdec+=picdec[i]
return out+outdec
class zzLineEdit(QLineEdit):
type="lineedit"
def __init__(self, txt="",pic=""):
txt=u"%s" % txt
self.pic=pic.strip()
if self.pic<>"":
txt=tran(txt, pic)
if "." in self.pic:
self.DECIMAL_POINT_POS=len(self.pic.split(".")[1])
else:
self.DECIMAL_POINT_POS=0
QLineEdit.__init__(self, txt)
if self.pic<>"":
self.setAlignment(Qt.AlignRight)
self.textEdited.connect(self.on_textEdited)
self.escapePressed=False
def event(self, ev):
if ev.type()==QEvent.ShortcutOverride:
if ev.key()==Qt.Key_Escape:
self.escapePressed=True
return QLineEdit.event(self, ev)
def keyPressEvent(self, ev):
if ev.key() in [Qt.Key_Enter, Qt.Key_Return]:
ev.accept()
self.focusNextChild()
else:
if self.pic<>"": self.picMake(ev)
else: QLineEdit.keyPressEvent(self, ev)
def on_textEdited ( self, _txt ) :
prevtext=QLineEdit.text(self)
cur_pos_left=len(prevtext)-self.cursorPosition()
self.setText(tran(_txt.replace(",", ""), self.pic))
if QLineEdit.text(self)=="."+"0"*self.DECIMAL_POINT_POS: cur_pos_left=len(QLineEdit.text(self))
if cur_pos_left>self.DECIMAL_POINT_POS:
self.setCursorPosition (len(QLineEdit.text(self))-cur_pos_left)
else:
self.setCursorPosition (len(QLineEdit.text(self))-cur_pos_left+1)
def setText(self, txt):
if len(self.pic)>0: txt=tran(txt, self.pic)
QLineEdit.setText(self, txt)
def valid(self): return True
def text(self):
txt=QLineEdit.text(self)
if len(self.pic)==0: return txt
#уберем не цифры
newnum=""
for i in txt:
if str(i) in "-0123456789.":newnum+=i
return newnum
def picMake(self, event):
key = event.key()
text=str(QLineEdit.text(self))
selected_text=self.selectedText()
curpos=self.cursorPosition()
was_modifiers=False if event.modifiers() in [Qt.NoModifier,Qt.KeypadModifier ] else True
if curpos==0 and len(text)>0:
if text[curpos]=="-":
self.setCursorPosition(curpos+1)
if key==Qt.Key_Period:
if curpos<(len(text)-self.DECIMAL_POINT_POS):
self.setCursorPosition(len(text)-self.DECIMAL_POINT_POS)
else:
self.setCursorPosition(len(text)-self.DECIMAL_POINT_POS-1)
return
if key==Qt.Key_Minus:
if len(text)>0:
if text[0]=="-":
self.setText(text[1:])
curpos-=1
else:
self.setText("-"+text)
curpos+=1
else:
self.setText("-"+text)
curpos+=1
self.setCursorPosition(curpos)
return
if event.modifiers() == Qt.NoModifier :
if key in [Qt.Key_Backspace,Qt.Key_Delete] and (self.hasSelectedText()==False):
cur_pos_left = len(text)-self.cursorPosition()
if key==Qt.Key_Backspace:
if len(text)==0:
return
if cur_pos_left<=self.DECIMAL_POINT_POS-1:
text=text[:curpos-1]+text[curpos:]
self.setText(text+"0")
self.setCursorPosition(curpos-1)
return
elif (cur_pos_left<=self.DECIMAL_POINT_POS and self.DECIMAL_POINT_POS>0) or \
text[curpos-1]==',':
self.setCursorPosition(curpos-1)
elif key == Qt.Key_Delete:
if cur_pos_left<=self.DECIMAL_POINT_POS+1 and cur_pos_left<>0 and self.DECIMAL_POINT_POS>0:
if cur_pos_left==self.DECIMAL_POINT_POS+1: curpos+=1
text=text[:curpos]+text[curpos+1:]
self.setText(text+"0")
self.setCursorPosition(curpos)
return
QLineEdit.keyPressEvent(self,event)
if "." in selected_text and not was_modifiers:
self.setCursorPosition(len(QLineEdit.text(self))-self.DECIMAL_POINT_POS-1)
if __name__ == "__main__":
app = QApplication(sys.argv)
MyApp = QApplication(sys.argv)
w=zzLineEdit("-1123456.1234", "999,99,99,999.9999")
w.setFont(QFont("Arial Bold", 54))
w.show()
sys.exit(app.exec_())
villager
может уже есть более оптимальные решения?
или тут можно что упростить?
#уберем не цифры
newnum=""
for i in txt:
if str(i) in "-0123456789.":newnum+=i
doza_andК сожалению, последняя портабельная версия питона с qt4 - это 3.3.
Конечно есть. Вы можете писать 123_445_64, это стандартные литералы начиная с питона 3.6
doza_andТо что я спрашиваю нестандартно? Даже в калькуляторах (не ПК) есть такая функция. В экселе эта фича включается без проблем, а в мега крутом питоне с тысячами классов этого нету?
Придумывать формат не соответствующий стандартным соглашениям плохо
FishHookМне нужно, чтобы пользователь, запустив программу pyqt и заполняя поле QLineEdit неким числом, видел, как программа автоматически разбивает данное число пробелами на тысячи для визуальной ясности, вот так:
Вы сформируйте вопрос уже правильно. Вам надо чтобы пользователь п программе на Qt видел цифры с разделителями или чтобы внутри программы на питоне были такие цифры?
1 234Потом это число пойдёт в расчёты.
18 654.42
59 854 145
Kyrym
Мне нужно, чтобы пользователь, запустив программу pyqt и заполняя поле QLineEdit неким числом, видел, как программа автоматически разбивает данное число пробелами на тысячи для визуальной ясности
Kyrym
В экселе эта фича включается без проблем, а в мега крутом питоне с тысячами классов этого нету?