2012-07-11 121 views
0

我正在开发一个简单的GTK + 3程序,它可以进行简单的计算。
我有一个浮点数的问题,因为如果我写.而不是,总数将是错误的。
所以我有float price;,我想用,代替.
示例:用户编写100.60作为价格,我想将其转换为100,60。我该怎么做?
我认为strchr,但它是一个浮动,我想我不能用吧XD
谢谢:)c用浮点数逗号替换点

编辑:添加的代码

#include <gtk/gtk.h> 
#include <stdlib.h> 
#include <string.h> 

GtkWidget *window; 
GtkWidget *grid; 
GtkWidget *c_button; 
GtkWidget *q_button; 
GtkWidget *u_name; 
GtkWidget *h_name; 
GtkWidget *pass; 
GtkWidget *label_user; 
GtkWidget *label_host; 
GtkWidget *label_pass; 

/* Funzione attivata alla pressione del pulsante connect */ 
int calcolo_guadagno(void){ 
    int num_btp, i, len; 
    float prezzo_attuale, subtotale, totale, diff_prezzo_attuale, PREZZO_PARTENZA = 99.42; 
    char cmcd[15]; 
    num_btp = (atoi(gtk_entry_get_text(GTK_ENTRY(h_name)))/PREZZO_PARTENZA); 
    prezzo_attuale = atof(gtk_entry_get_text(GTK_ENTRY(u_name))); 
    diff_prezzo_attuale = (prezzo_attuale - PREZZO_PARTENZA); 
    subtotale = (num_btp * diff_prezzo_attuale); 
    totale = subtotale-((subtotale/100)*12.5); 
    if(prezzo_attuale < PREZZO_PARTENZA){ 
     strcpy(cmcd, "Sei in perdita..."); 
     gtk_entry_set_text(GTK_ENTRY(pass),cmcd); 
     return EXIT_SUCCESS; 
    } 
    if(prezzo_attuale == PREZZO_PARTENZA){ 
     strcpy(cmcd, "Sei in pari..."); 
     gtk_entry_set_text(GTK_ENTRY(pass),cmcd); 
     return EXIT_SUCCESS; 
    } 
    sprintf(cmcd, "%.3f", totale); 
    gtk_entry_set_text(GTK_ENTRY(pass),cmcd); 
    return EXIT_SUCCESS; 
} 



    int main (int argc, char *argv[]){ 

    /* Inizializziamo le librerie GTK+ */ 
    gtk_init (&argc, &argv); 

    /* Creiamo la finestra principale, impostiamo il titolo, la posizione e la dimensione */ 
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_title (GTK_WINDOW (window), "Calcolo Guadagno BTP"); 
    gtk_window_set_position (GTK_WINDOW(window), GTK_WIN_POS_CENTER); 
    gtk_window_set_default_size (GTK_WINDOW(window), 350, 250); 

    /* Quando premiamo chiudi si 'disturgge' tutto */ 
    g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); 

    /* Impostiamo il bordo e dichiariamo le finestra ridimensionabile */ 
    gtk_container_set_border_width (GTK_CONTAINER (window), 10); 
    gtk_window_set_resizable(GTK_WINDOW(window), TRUE); 

    /* Creiamo una nuova griglia, la aggiungiamo alla finestra e impostiamo gli spazi fra i vari widget */ 
    grid = gtk_grid_new(); 
    gtk_container_add (GTK_CONTAINER (window), grid); 
    gtk_grid_set_row_spacing (GTK_GRID (grid), 3); 

    /* Creiamo delle label con il relativo nome */ 
    label_user = gtk_label_new("Prezzo attuale "); 
    label_host = gtk_label_new("Soldi investiti "); 
    label_pass = gtk_label_new("Guadagno netto "); 

    /* Creo una entry_text */ 
    h_name = gtk_entry_new(); 
    /* Impostiamo il testo trasparente che scompare quando clicco o scrivo */ 
    gtk_entry_set_placeholder_text (GTK_ENTRY (h_name), "Soldi investiti"); 
    u_name = gtk_entry_new(); 
    gtk_entry_set_placeholder_text (GTK_ENTRY (u_name), "Prezzo attuale"); 
    pass = gtk_entry_new(); 
    /* Impostiamo il campo password non visibile */ 
    gtk_editable_set_editable (GTK_EDITABLE (pass), 0); 
    /* Creiamo i pulsanti e li connettiamo alle relative funzioni */ 
    c_button = gtk_button_new_with_label ("Calcola"); 
    g_signal_connect (c_button, "clicked", G_CALLBACK (calcolo_guadagno), NULL); 
    q_button = gtk_button_new_with_label ("Esci"); 
    g_signal_connect (q_button, "clicked", G_CALLBACK (gtk_main_quit), NULL); 

    /* Imposto i widget come espandibili sia in orizzontale che in verticale */ 
    gtk_widget_set_hexpand(u_name, TRUE); 
    gtk_widget_set_vexpand(u_name, TRUE); 
    gtk_widget_set_hexpand(h_name, TRUE); 
    gtk_widget_set_vexpand(h_name, TRUE); 
    gtk_widget_set_hexpand(pass, TRUE); 
    gtk_widget_set_vexpand(pass, TRUE); 

    /* Posizioniamo i widget all'interno della griglia */ 
    gtk_grid_attach (GTK_GRID (grid), label_host, 0, 0, 1, 1); 
    gtk_grid_attach (GTK_GRID (grid), h_name, 1, 0, 1, 1); 
    gtk_grid_attach (GTK_GRID (grid), label_user, 0, 1, 1, 1); 
    gtk_grid_attach (GTK_GRID (grid), u_name, 1, 1, 2, 1); 
    gtk_grid_attach (GTK_GRID (grid), label_pass, 0, 2, 1, 1); 
    gtk_grid_attach (GTK_GRID (grid), pass, 1, 2, 1, 1); 
    gtk_grid_attach (GTK_GRID (grid), c_button, 0, 3, 2, 1); 
    gtk_grid_attach (GTK_GRID (grid), q_button, 0, 4, 2, 1); 

    /* Mostriamo tutti i widget */ 
    gtk_widget_show_all (window); 

    /* Entriamo nel loop principale delle GTK+, da questo punto l'applicazione attende l'accadere di un qualsiasi evento */ 
    gtk_main(); 

    return 0; 
} 
+2

请记住,float的内部表示中没有逗号。逗号仅仅是根据语言环境将“float”值打印到屏幕上的效果。这意味着你的转换与浮动无关,但是你如何表达它。此外,将价格表示为花车通常是一个非常糟糕的主意。 – pmr 2012-07-11 13:19:43

+0

我知道,但它只是一个个人计划:D什么都不会分享! – polslinux 2012-07-11 13:20:41

+0

@poslinux如果你对自己的代码不够自豪,不愿意向其他人展示它,那就不值得写。 :) – pmr 2012-07-11 13:26:30

回答

0
int i; 
int len = strlen(string); 
for (i = 0; i < len; i++) { 
    if (string[i] == '.') { 
     string[i] = ','; 
     i = len; // or `break;` 
    } 
} 
+0

但我有一个浮动不是一个字符串! – polslinux 2012-07-11 13:14:52

+1

char buffer [50]; sprintf(缓冲区,%f,价格); – yhyrcanus 2012-07-11 13:19:40

+0

@polslinux float的值来自哪里?你说“用户写'100.60' ...”,这意味着有用户输入,这将是一个字符串。 – 2012-07-11 13:27:19

2

看一看setlocale

如果您使用的区域使用逗号作为分隔符,它将用于输入/输出操作。

这是你在找什么?

+0

是和不!这不能解决我完全的问题...我需要显式的'.'到','转换! – polslinux 2012-07-11 13:16:29

1

strpbrk功能<string.h>可以提供帮助。

void dot_to_comma(char *input) { 
    char *ptr = NULL; 
    while(ptr = strpbrk(input, ".")) { //find the first dot in input 
     *ptr = ','; //replace the dot with a comma 
    } 
} 
+0

不起作用:( – polslinux 2012-07-11 13:32:05

+0

有什么不对?你可以提供更多的信息,它如何不起作用? – 2012-07-11 13:50:45

+0

只是它找不到“。”:) – polslinux 2012-07-11 13:57:27

3

价格作为花车一般是一个非常糟糕的主意。浮点运算是不精确的,会在非常奇怪的情况下回来咬你。使用struct来表示货币的两个部分,然后执行一些算术和打印。

type struct { 
    int main; 
    int sub; 
} money; 

void add(money* result, money* x, money* y); 

void print(money* x); 
void read(money* result, const char* input); 

您的打印功能可以明确指定应使用哪个分隔符。