2014-01-24 96 views
0

關於本程序

我有一個顯示菜單的程序。該菜單包含一系列項目(字符串)和價格(雙重類型值)。該程序沒有其他目的,但顯示一個菜單。C++轉換爲貨幣值

問題

當然,默認情況下,雙精度型值以小數顯示。這在這種情況下很有用,因爲我們列出了物品的價格;然而,通常價格最初始於美元符號($)。據我所知, iomanip標題包含「put_money」&「put_money」函數,但這些不需要做我需要他們做的事情。我需要的是菜單中的每個價格都與美元符號一起顯示在實際值旁邊。例如:

我所需的輸出是這樣的:

Please select an item to purchase: 

______________________________________________________ 

Item: Prices: Item: Prices: Item: Prices: 
______________________________________________________ 

Water  $100  Milk  $200 Juice  $300 
    Wine  $400 Bread  $500 Apple  $600 
    Tuna  $700 Steak  $800 Bandage  $900 
Med-Kit $1000 Splint $1100 Thread $1200 

我目前的計劃會產生這樣:

Please select an item to purchase: 

______________________________________________________ 

Item: Prices: Item: Prices: Item: Prices: 
______________________________________________________ 

Water  100  Milk  200 Juice  300 
    Wine  400 Bread  500 Apple  600 
    Tuna  700 Steak  800 Bandage  900 
Med-Kit 1000 Splint  1100 Thread  1200 

有沒有美元符號添加到所有的更有效方式我的價值,而不必手動添加每個單獨的美元符號?我只是覺得手動添加它們可能在一個大型項目中很乏味(當然不是這樣,但可能類似)。

我的代碼

#include <iostream> 
#include <iomanip> 
#include <string> 

int main(void) { 


unsigned short int width = 10; 
unsigned short int prec = 6; 

float prices[12] = {100.00, 200.00, 300.00, 400.00, 500.00, 600.00, 700.00, 800.00, 900.00, 1000.00, 1100.00, 1200.00}; 

std::string items[12] = {"Water", "Milk", "Juice", "Wine", "Bread", "Apple", "Tuna", "Steak", "Bandage", "Med-Kit", "Splint","Thread"}; 

std::cout << "\nPlease select an item to purchase:\n\n"; 

std::cout << "_________________________________________________________________\n\n"; 

std::cout << std::setw(width) << "Item:" << std::setw(width) << "Prices:" <<std::setw(width) << "Item:" <<std::setw(width) << "Prices;" <<std::setw(width) << "Item:" <<std::setw(width) << "Prices:" << "\n"; 

std::cout << "_________________________________________________________________\n\n"; 

std::cout << std::setw(width) <<items[0] <<std::setw(width) << prices[0] <<std::setw(width) << items[1] <<std::setw(width) << prices[1] <<std::setw(width) << items[2] <<std::setw(width) << prices[2] << "\n"; 
std::cout << std::setw(width) <<items[3] <<std::setw(width) << prices[3] <<std::setw(width) << items[4] <<std::setw(width) << prices[4] <<std::setw(width) << items[5] <<std::setw(width) << prices[5] << "\n"; 
std::cout << std::setw(width) <<items[6] <<std::setw(width) << prices[6] <<std::setw(width) << items[7] <<std::setw(width) << prices[7] <<std::setw(width) << items[8] <<std::setw(width) << prices[8] << "\n"; 
std::cout << std::setw(width) <<items[9] <<std::setw(width) << prices[9] <<std::setw(width) << items[10] <<std::setw(width) << prices[10] <<std::setw(width) << items[11] <<std::setw(width) << prices[11] << "\n"; 

std::cin.get(); 
std::cin.get(); 

return 0; 



} 

請原諒的代碼過長。感謝大家提前幫助。

+0

我不是要求檢查我的代碼,但有助於顯示貨幣值。@JustSid – Jake2k13

+0

嘗試'std :: cout << std :: setw(width)<< items [0] << std :: setw(width)<<「$」<< prices [0] << std :: setw (width)<< items [1] << std :: setw(width)<<「$」<< prices [1] << std :: setw(width)<< items [2] << std :: setw (width)<<「$」<< prices [2] <<「\ n」;' –

+0

這可行,但我想知道是否有更有效的方法,而不是手動將其添加到每個值。這很容易變成一個單調乏味且壓倒一切的過程。但這是一個很好的建議。 @Ankit B – Jake2k13

回答

4

爲什麼不創建class來存儲項目? 例如,你可以有:

class Item 
{ 
    private: 
    double price; 
    string item; 

    public: 
    void display() 
    { 
     cout << "$" << price; 
    } 
}; 

所以你調用display功能顯示在貨幣價值的價格。

+0

好主意,所以將價格數組存儲在私人範圍內,稍後使用對象和函數調用它們?我仍然在學習C++ – Jake2k13

+0

你可以有一個'Item'數組,例如在你的'main'函數中,你可以有'Item items [12]'。如果您希望程序能夠修改它,您還可以在類Item中包含setter/getter函數。 – rcs

3

其實std::put_money可以並且會做你正在問什麼如果你正確使用它。

有兩部分。首先,你必須選擇一個區域。默認的「C」語言環境根本沒有定義要使用的貨幣符號。通常你會希望使用無名的區域,這樣的事情:

std::cout.imbue(std::locale("")); 

這個選(並使用)該用戶配置他們的環境中的語言環境,所以(比如)一個典型的美國用戶將獲得一些美國英語區域使用美元符號作爲貨幣符號,但是典型的德國用戶將獲得歐元符號作爲貨幣符號的德語區域設置。這也會影響數字的格式。下面的示例輸出使用逗號作爲千位分隔符和句點(句號)作爲小數點分隔符。許多歐洲國家的用戶(例如)應該期望這兩個國家被顛倒過來。

然後,您需要設置流的showbase標誌。對於其他數字,這會告訴數據流顯示已轉換數字的基數,因此(例如)如果您打印出十六進制數字,則會在前面加上0x(或0X)。當你寫錢時,它會重新表示是否顯示貨幣符號。

您通常希望將其與您已收到的有關創建類(或結構)以存儲有關項目的數據的建議結合使用。而不是一個名爲display的函數,我會創建一個operator<<的超載來顯示一個項目。

請注意,貨幣值存儲爲long double s。在一個典型的情況下,它將作爲正常使用中最小面額的貨幣(例如在美國,整數個便士)的整數存儲。因此,初始化爲100.0實際上意味着值爲$1.00

隨着這(和離開了你的頭的代碼),創建和顯示的表可能是這個樣子:

#include <iostream> 
#include <iomanip> 
#include <string> 
#include <vector> 

unsigned short int width=10; 
unsigned short int prec=6; 

class item { 
    std::string name; 
    long double price; 

public: 
    item(std::string const &name, double price): name(name), price(price) {} 

    friend std::ostream &operator<<(std::ostream &os, item const &i) { 
     return os<<std::setw(width) << i.name 
       <<std::setw(width) << std::showbase << std::put_money(i.price); 
    } 
}; 

int main(void) { 
    std::vector<item> items { 
     {"water", 10000}, 
     {"Milk", 20000}, 
     {"Juice", 30000}, 
     {"Wine", 40000}, 
     {"Bread", 60000}, 
     {"Apple", 70000}, 
     {"Tuna", 80000}, 
     {"Steak", 90000}, 
     {"Bandage", 100000}, 
     {"Med-Kit", 110000}, 
     {"Splint", 120000}, 
     {"Thread", 130000} 
    }; 

    std::cout.imbue(std::locale("")); 

    unsigned count=0; 

    for (auto &&item:items) { 
     std::cout<<item; 
     if (++count==3) { 
      std::cout<<"\n"; 
      count=0; 
     } 
    } 
} 

結果:

water $100.00  Milk $200.00  Juice $300.00 
    Wine $400.00  Bread $600.00  Apple $700.00 
    Tuna $800.00  Steak $900.00 Bandage $1,000.00 
    Med-Kit $1,100.00 Splint $1,200.00 Thread $1,300.00 

如果您決定做請注意,它不會像在要寫入的項目前插入$一樣簡單。問題在於,當你寫出值時,你幾乎需要明確地設置寬度和精度。當你這樣做,你很快就會發現,$被插入之前人數爲填充,所以(例如)你的第一個項目將最終看起來是這樣的:

water$ 100.00 

...而不是將貨幣符號放在您幾乎可以肯定需要的數字旁邊。它可以防止有足夠的額外的工作:

std::ostringstream temp; 

temp << '$' << std::setprecision(your_precision) << value; 

std::cout << std::setw(your_width) << temp.str(); 

雖然這可能是開放的說法,使用std::put_money是多一點的工作比你想,你的時候得到的格式,甚至相當接近對自己來說是正確的,它仍然還有很多工作要做(並且增加對國際化的最小支持也是相當多的工作)。


  1. 不過請注意,,,雖然符號根據用戶的語言環境自動選擇,沒有試圖將值轉換,所以如果我進入1美元,並顯示該值在德語區域,它會顯示爲1歐元(反之亦然)。從技術上講,我不相信標準實際上需要這樣做,但這是我見過的所有編譯器實際上都是這樣做的。該標準要求get_moneyput_money是對稱的,所以如果用戶輸入$100.00並且你用get_money讀取它,存儲所產生的任何內容,然後用put_money將其寫回,那麼應該得到$100.00作爲結果。