// Path: src/main/java/org/ojalgo/finance/data/DatePrice.java
// public abstract class DatePrice implements KeyValue<LocalDate, Double> {
// 
//     public final LocalDate key;
// 
//     protected DatePrice(CharSequence text) {
// 
//         super();
// 
//         key = LocalDate.parse(text);
//     }
// 
//     protected DatePrice(CharSequence text, DateTimeFormatter formatter) {
// 
//         super();
// 
//         key = LocalDate.parse(text, formatter);
//     }
// 
//     protected DatePrice(final LocalDate date) {
// 
//         super();
// 
//         key = date;
//     }
// 
//     public int compareTo(final KeyValue<LocalDate, ?> ref) {
//         return key.compareTo(ref.getKey());
//     }
// 
//     @Override
//     public boolean equals(final Object obj) {
//         if (this == obj) {
//             return true;
//         }
//         if (obj == null) {
//             return false;
//         }
//         if (!(obj instanceof DatePrice)) {
//             return false;
//         }
//         final DatePrice other = (DatePrice) obj;
//         if (key == null) {
//             if (other.key != null) {
//                 return false;
//             }
//         } else if (!key.equals(other.key)) {
//             return false;
//         }
//         return true;
//     }
// 
//     public final LocalDate getKey() {
//         return key;
//     }
// 
//     public abstract double getPrice();
// 
//     public final Double getValue() {
//         return this.getPrice();
//     }
// 
//     @Override
//     public int hashCode() {
//         final int prime = 31;
//         int result = 1;
//         result = (prime * result) + ((key == null) ? 0 : key.hashCode());
//         return result;
//     }
// 
//     @Override
//     public final String toString() {
//         return key + ": " + this.getPrice();
//     }
// 
// }


import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import org.ojalgo.RecoverableCondition;
import org.ojalgo.finance.data.DatePrice;
import org.ojalgo.netio.ASCII;
import org.ojalgo.netio.BasicParser;
            part = line.substring(inclBegin, exclEnd);
            try {
                retVal.open = Double.parseDouble(part);
            } catch (final NumberFormatException ex) {
                retVal.open = Double.NaN;
            }

            inclBegin = exclEnd + 1;
            exclEnd = line.indexOf(ASCII.COMMA, inclBegin);
            part = line.substring(inclBegin, exclEnd);
            try {
                retVal.high = Double.parseDouble(part);
            } catch (final NumberFormatException ex) {
                retVal.high = Double.NaN;
            }

            inclBegin = exclEnd + 1;
            exclEnd = line.indexOf(ASCII.COMMA, inclBegin);
            part = line.substring(inclBegin, exclEnd);
            try {
                retVal.low = Double.parseDouble(part);
            } catch (final NumberFormatException ex) {
                retVal.low = Double.NaN;
            }

            inclBegin = exclEnd + 1;
            exclEnd = line.indexOf(ASCII.COMMA, inclBegin);
            part = line.substring(inclBegin, exclEnd);
            try {
                retVal.close = Double.parseDouble(part);
// Path: src/main/java/org/ojalgo/finance/data/DatePrice.java
// public abstract class DatePrice implements KeyValue<LocalDate, Double> {
// 
//     public final LocalDate key;
// 
//     protected DatePrice(CharSequence text) {
// 
//         super();
// 
//         key = LocalDate.parse(text);
//     }
// 
//     protected DatePrice(CharSequence text, DateTimeFormatter formatter) {
// 
//         super();
// 
//         key = LocalDate.parse(text, formatter);
//     }
// 
//     protected DatePrice(final LocalDate date) {
// 
//         super();
// 
//         key = date;
//     }
// 
//     public int compareTo(final KeyValue<LocalDate, ?> ref) {
//         return key.compareTo(ref.getKey());
//     }
// 
//     @Override
//     public boolean equals(final Object obj) {
//         if (this == obj) {
//             return true;
//         }
//         if (obj == null) {
//             return false;
//         }
//         if (!(obj instanceof DatePrice)) {
//             return false;
//         }
//         final DatePrice other = (DatePrice) obj;
//         if (key == null) {
//             if (other.key != null) {
//                 return false;
//             }
//         } else if (!key.equals(other.key)) {
//             return false;
//         }
//         return true;
//     }
// 
//     public final LocalDate getKey() {
//         return key;
//     }
// 
//     public abstract double getPrice();
// 
//     public final Double getValue() {
//         return this.getPrice();
//     }
// 
//     @Override
//     public int hashCode() {
//         final int prime = 31;
//         int result = 1;
//         result = (prime * result) + ((key == null) ? 0 : key.hashCode());
//         return result;
//     }
// 
//     @Override
//     public final String toString() {
//         return key + ": " + this.getPrice();
//     }
// 
// }


// Path: src/main/java/org/ojalgo/finance/data/parser/YahooParser.java
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import org.ojalgo.RecoverableCondition;
import org.ojalgo.finance.data.DatePrice;
import org.ojalgo.netio.ASCII;
import org.ojalgo.netio.BasicParser;

            part = line.substring(inclBegin, exclEnd);
            try {
                retVal.open = Double.parseDouble(part);
            } catch (final NumberFormatException ex) {
                retVal.open = Double.NaN;
            }

            inclBegin = exclEnd + 1;
            exclEnd = line.indexOf(ASCII.COMMA, inclBegin);
            part = line.substring(inclBegin, exclEnd);
            try {
                retVal.high = Double.parseDouble(part);
            } catch (final NumberFormatException ex) {
                retVal.high = Double.NaN;
            }

            inclBegin = exclEnd + 1;
            exclEnd = line.indexOf(ASCII.COMMA, inclBegin);
            part = line.substring(inclBegin, exclEnd);
            try {
                retVal.low = Double.parseDouble(part);
            } catch (final NumberFormatException ex) {
                retVal.low = Double.NaN;
            }

            inclBegin = exclEnd + 1;
            exclEnd = line.indexOf(ASCII.COMMA, inclBegin);
            part = line.substring(inclBegin, exclEnd);
            try {
                retVal.close = Double.parseDouble(part);
            } catch (final NumberFormatException ex) {