在Java中读取货币符号作为字符串

时间:2018-02-08 07:50:18

标签: java csv currency iso

我实际上需要在 pgAdmin 数据库中为货币导入 csv 文件。我的文件如下;

enter image description here

我的代码如下,使用ISO-8859-1格式。

        File fileDir = new File(fileName);       
        FileInputStream fis= new FileInputStream(fileDir);
        InputStreamReader isr= new InputStreamReader(fis, "ISO-8859-1");
        BufferedReader br = new BufferedReader(isr);            
        String line;
        line = br.readLine();
        String[] arrayHeader = line.split(";");         
        size = arrayHeader.length;       

        if(size==expectedSize){
             //check header 
            String header[] = {"Currency_ISO", "Currency_Label", "Currency_Symbol"};
            for(int i=0;i<header.length;i++){
                if(arrayHeader[i].trim().equals(header[i])){
                    fileStatus = true; 
                    sResult = "File Status: Valid <br/> "; 
                }
                else{
                    fileStatus = false;
                    sResult = "File Status: Invalid <br/> "; 
                    break;
                }
            }
        }else{
            fileStatus = false;  
            sResult = "File Status: Invalid <br/> ";    
        }       

        if(fileStatus){     

             while ((line = br.readLine()) != null) {
                 String[] arrayData = line.split(";", -1);

                //create object 
                objCurrency = new clsCurrency(); 

                if(arrayData[0] != "" && !arrayData[0].isEmpty() && arrayData[0].trim() != ""){

                    objCurrency.setsCurrencyIso(arrayData[0].trim());
                }else{
                    objCurrency.setsCurrencyIso(null);
                }

                if(arrayData[1] != "" && !arrayData[1].isEmpty() && arrayData[1].trim() != ""){                                         
                    objCurrency.setsCurrencyLabel(arrayData[1].trim());
                }else{
                    objCurrency.setsCurrencyLabel(null);
                }

                if(arrayData[2] != "" && !arrayData[2].isEmpty() && arrayData[2].trim() != ""){
                System.out.println("setsLocalCurrencySymbol: " + arrayData[2]);
                    objCurrency.setsCurrencySymbol(arrayData[2].trim());
                }else{
                    objCurrency.setsCurrencySymbol(null);
                }

                lstCurrencyImported.add(objCurrency);

            }//end while    

如您所见,我有一个System.out.Println()来检查符号的值。但主要问题是Symbol没有被正确读取。它返回?。见下面的println;

[stdout] (default task-7) setsCurrencySymbol: ?

我尝试将格式更改为UTF-8UTF-16,但徒劳无功。 我在网上看到Java有货币类,但问题是我需要直接从csv中读取它,而且我不认为用户知道每种货币的代码。

我知道如何从这里开始呢?

2 个答案:

答案 0 :(得分:3)

如果CSV文件包含欧元符号,则该文件不可能是ISO-8859-1。 ISO-8859-1中不存在欧元符号。它已添加到ISO-8859-15

首先,要了解CSV文件实际使用的编码方式。然后,配置Java @Autowired private AppConfig config; @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { contextSource = new LdapContextSource(); contextSource.setUrl(config.getProperty("LDAP_CONFIG_BASE_URL")); contextSource.setAnonymousReadOnly(Boolean.parseBoolean(config.getProperty("LDAP_CONFIG_IS_ANONYMOUS"))); contextSource.afterPropertiesSet(); ldapTemplate = new LdapTemplate(contextSource); // Do auth related stuff } 以使用该编码。

答案 1 :(得分:1)

  • ISO-8859-1 aka Latin-1不包含€符号。
  • ISO-8859-15 的扩展符号。
  • Windows-1252 / CP-1252 (代码页)又名Windows Latin-1取代了仍被称为ISO-8859-1的浏览器(甚至正式版) HTML5)。

由于 Windows-1252 还包含比ISO-8859-15更多的字符,如引号等逗号,最好用它来正确阅读文本。

然后,文本在字符串中是正确的(以Unicode格式)。

替代方案,当用户的PC确定使用哪个字符集时,以及 软件在那里运行,你可以使用Charset.defaultCharset()作为InputStreamReader的参数,或者根本不给出参数。

在控制台中显示字符串会再次涉及到默认操作系统字符集的转换。可能也是Windows中的Windows-1252,在美国。字符集不知道它将被转换为?,但它将存在于字符串中。

例如,您可以将其写入UTF-8文件。