2017-06-06 2 views
1

ピクチャー値をシフトする:不整列列:どのようにSQLを使用する際にpythonで

を上記のリンク画像をご参照ください。私は彼らの周りのかっこで負の値を示す電子メールレポートを持っています。私は、各番号の最後の桁がお互いに並んでいるようにする必要があります。値は、SQLステートメントの実行時にforループとifステートメントを使用して印刷されます。値は、SQL文を実行するときに表示されます。

括弧内の数字の最後の桁に合わせるために正の値を一度左にシフトするにはどうすればよいですか?私は、ソリューションを実装しようとしたところ

m1_total=0 
m3_total=0 
m6_total=0 
m12_total=0 


for line in curs: 
    if (line[1]==0) or (line[1]==None): #skip if the M1 is 0 
     continue 


    m1=0 
    m3=0 
    m6=0 
    m12=0 
    if line[1]>0: 
     m1=line[1] 
    if line[2]>0: 
     m3=round(line[2]/3) 
    if line[3]>0: 
     m6=round(line[3]/6) 
    if line[4]>0: 
     m12=round(line[4]/12) 
    mc3=0 
    mc6=0 
    mc12=0 
    if m3 > 0: 
     mc3=round((m1/m3)*100-100,2) 
    if m6>0: 
     mc6=round((m3/m6)*100-100,2) 
    if m12 > 0: 
     mc12=round((m6/m12)*100-100,2) 


    outStr+=str(line[0]).ljust(13,'.')+round_dolls(m1,9)+round_dolls(m3,9)+round_dolls(m6,9)+round_dolls(m12,9) 
    outStr+=round_dolls(mc3,14,'d')+round_dolls(mc6,9,'d')+round_dolls(mc12,9,'d') + '<br>' 
    m1_total+=m1 
    m3_total+=m3 
    m6_total+=m6 
    m12_total+=m12 
    mc3_total=0 
    mc6_total=0 
    mc12_total=0 
    if m3_total > 0: 
     mc3_total=round((m1_total/m3_total)*100-100,2) 
    if m6_total>0: 
     mc6_total=round((m3_total/m6_total)*100-100,2) 
    if m12_total > 0: 
     mc12_total=round((m6_total/m12_total)*100-100,2) 

    if line[-1] != ')': 
     str(m12) = str(m12)[:-1] 

最後の2行がありますが、それはうまくいきませんでした:

はここでレポートの列を印刷するループするためのものです。ここ

は括弧内に負の数を置く方法であって、ここで

def format_num(num,justLen,justWithChar='.',howManyDecimal=0,putComma='Y',minusFormat='-',zeroChar='0'): 
    if not num: 
     num = 0 

    if num == 0: 
     if zeroChar <> '0': 
      return zeroChar.rjust(justLen,justWithChar) 

    roundedNum = round(num, howManyDecimal) # rounded becomes float 
    if putComma=='Y': # put comma at thousand 
     numStr = '{:,}'.format(roundedNum) # fractional part is truncated to 5 decimal place 
    else: 
     numStr = str(roundedNum) 
    if howManyDecimal == 0: 
     numStr = numStr.rsplit('.')[0] # 1,234.99 -> ['1,234', '99'] 
    else: # to pad with 0 ex) 4234.9 -> 4234.90 
     numStr=numStr.rsplit('.')[0] + '.' + numStr.rsplit('.')[1].ljust(howManyDecimal, '0') 

    if num < 0: 
     if minusFormat=='P': # change - sign to parenthesis format 
      numStr = numStr.replace('-', '(') + ')' 

    return numStr.rjust(justLen,justWithChar) 

はround_dolls(からコードである):

def round_dolls(num, justLen, format='I', zeroChar='0'): 
    if format == 'Q': # quantity - no comma - 99999 
     return format_num(num, justLen, '.', 0, 'N','-',zeroChar) 
    elif format == 'I': # integer - 99,999 
     return format_num(num, justLen, '.', 0, 'Y','-',zeroChar) 
    elif format == 'F': # float wit 2 decimal places - 99,999.99 
     return format_num(num, justLen, '.', 2, 'Y','-',zeroChar) 
    elif format == 'D': # 99,999 negative number (99,999) 
     return format_num(num, justLen, '.', 0, 'Y','P',zeroChar) 
    elif format == 'd': # 99,999.99 negative number (99,999.99) 
     return format_num(num, justLen, '.', 2, 'Y','P',zeroChar) 
    elif format == 'P': # percentage 
     return format_num(num*100, justLen, '.', 0) + '%' 
    else: 
     return 'Format not specified' 
+0

カッコを使用する負の値ですか? – Barmar

+0

数字が正の場合は、あとで空白で印刷してください。これは最後の桁を括弧内の数字の最後の桁に合わせます。 – Barmar

+1

また、その前の '.'の数を1つ減らしてください。 – Barmar

答えて

1

変更:

if num < 0: 
    if minusFormat=='P': # change - sign to parenthesis format 
     numStr = numStr.replace('-', '(') + ')' 

します。

あなたが行の最後の文字で .したくない場合、あなたはそれが )ない場合は、文字を削除するには for c in range(len(line))ループの後にこれを置くことができ

:そのコードでそれが変化している

if rowStr[-1] != ')': 
    rowStr = rowStr[:-1] 
+0

それは動作しますが、 "。"最後の列の最後に、「123.45」のような数字を印字します。 –

+0

これは '+ justWithChar'のためです。そのすべての文字を値にする必要はありませんか? – Barmar

+0

'format_num()'は、行の最後の数字であることを知らないため、別のフォーマットにすることはできません。それを呼び出すコードを見つけたら、最後に '.'を取り除くことができます。 – Barmar

関連する問題