⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simplenumericitemimpl.java

📁 xbrlapi的源码
💻 JAVA
字号:
package org.xbrlapi.impl;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.xbrlapi.SimpleNumericItem;
import org.xbrlapi.utilities.XBRLException;

/**
 * @author Geoffrey Shuetrim (geoff@galexy.net)
 */

public class SimpleNumericItemImpl extends NumericItemImpl implements SimpleNumericItem {
	
	/** 
	 * Get the value of the fact as a string.
	 * @return the value of fact as a string.
	 * @throws XBRLException
	 * @see org.xbrlapi.SimpleNumericItem#getValue()
	 */
	public String getValue() throws XBRLException {
		return getDataRootElement().getTextContent().trim();
	}
	


	/** 
	 * Get the value of the fact after adjusting for the specified precision.
	 * @return the value of the fact as a string, adjusted for the specified precision.
	 * @throws XBRLException
	 * @see org.xbrlapi.SimpleNumericItem#getPrecisionAdjustedValue()
	 */
	public String getPrecisionAdjustedValue() throws XBRLException {
		String precision = getInferredPrecision();
		if (precision.equals("INF")) return getValue();
		
		String rawValue = getValue();
		Pattern pattern = Pattern.compile("^(-?)(\\d*)(\\.?)(\\d*)(e?-?\\d*)?$", Pattern.CASE_INSENSITIVE);
		Matcher matcher = pattern.matcher(getValue());
        String digitsBeforeDecimal = "";
        String digitsAfterDecimal = "";
        // String exponent = "";
        if (matcher.matches()) {
    		digitsBeforeDecimal = matcher.group(2);
    		digitsAfterDecimal= matcher.group(4);
        	String digits =  digitsBeforeDecimal + digitsAfterDecimal;
        	Pattern pattern2 = Pattern.compile("^(0*)(\\d{0," + precision + "})(\\d*)$");
            Matcher matcher2 = pattern2.matcher(digits);
            if (! matcher2.matches()) throw new XBRLException("The raw value is not formatted in a way that allows precision adjustment.");            
            digits = matcher2.group(1) + matcher2.group(2);
            int zerosToInsert = matcher2.group(3).length();
            for (int i=1; i<=zerosToInsert; i++) digits += "0";
    		digitsBeforeDecimal = digits.substring(0,digitsBeforeDecimal.length());
    		digitsAfterDecimal= digits.substring(digitsBeforeDecimal.length(), digits.length());
        	String value = matcher.group(1) + digitsBeforeDecimal + matcher.group(3) + digitsAfterDecimal + matcher.group(5);   	
        	return value;
        }
		throw new XBRLException("Precision adjustment failed using precision " + precision + " and value " + rawValue);
	}
	
	/**
	 * Get the inferred value for precision from the value for 
	 * decimals and the value of the fact.
	 * @return inferred value for precision.
	 * @throws XBRLException
	 * @see org.xbrlapi.SimpleNumericItem#getInferredPrecision()
	 */
	public String getInferredPrecision() throws XBRLException {
		if (! hasDecimals()) return getPrecision();
		
		String decimals = getDecimals();
		if (decimals.equals("INF")) return "INF";
				
		//int d = new Integer(decimals).intValue();

		// Parse the value into its components
		Pattern pattern = Pattern.compile("^-?(\\d*)\\.?(\\d*)(e?(-?\\d*))?$", Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(getValue());
        String digitsBeforeDecimal = null;
        String digitsAfterDecimal = null;
        String exponent = null;
        if (matcher.matches()) {
    		digitsBeforeDecimal = matcher.group(1);
    		digitsAfterDecimal= matcher.group(2);
    		exponent = matcher.group(4);
        }
		
		// Eliminate leading zeros before decimal place.
		if (digitsBeforeDecimal != null) {
			pattern = Pattern.compile("^(0+)");
	        matcher = pattern.matcher(digitsBeforeDecimal);
	        digitsBeforeDecimal = matcher.replaceAll("");
		}
		
		int part1 = 0;
		if (digitsBeforeDecimal != null) {
			part1 = digitsBeforeDecimal.length();
		} else {
			if (digitsAfterDecimal != null) {
				pattern = Pattern.compile("^(0+)");
		        matcher = pattern.matcher(digitsBeforeDecimal);
		        if (matcher.matches()) {
			        String zerosAfterDecimal = matcher.group(1);
			        if (zerosAfterDecimal != null) {
			        	part1 = -(zerosAfterDecimal.length()); 
			        }
		        }
			}
		}
		
		int part2 = 0;
		if (exponent != null && !exponent.equals("")) part2 = (new Integer(exponent)).intValue();

		int part3 = (new Integer(decimals)).intValue();
		
		int x = part1 + part2 + part3;
		
		int precision = (x > 0) ? x : 0;
		
		return (new Integer(precision)).toString();	
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -